Сортировка массива объектов в Ruby атрибутом объекта?

PHP 5.3 представил новый метод шифрования, который действительно прост в использовании: openssl_encrypt и openssl_decrypt. Это не очень хорошо задокументировано, поэтому вот простой пример:

$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC";  // AES is used by the U.S. gov't to encrypt top secret documents.
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";

//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);

//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);

//Result
echo "Encrypted: $encryptedMessage 
Decrypted: $decryptedMessage";

Я выбрал 256-AES, потому что он надежный и быстрый. Он был принят правительством США для шифрования сверхсекретных документов. Это быстро, учитывая машину и программное обеспечение. Вот список доступных методов шифрования:

AES-128-CBC, AES-128-CFB, AES-128-CFB1, AES-128-CFB8, AES-128-ECB, AES-128-OFB, AES-192-CBC, AES-192-CFB, AES-192-CFB1, AES-192-CFB8, AES-192-ECB, AES-192-OFB, AES-256-CBC, AES-256-CFB, AES- 256-CFB1, AES-256-CFB8, AES-256-ECB, AES-256-OFB, BF-CBC, BF-CFB, BF-ECB, BF-OFB, CAMELLIA-128-CBC, CAMELLIA-128-CFB, CAMELLIA-128-CFB1, CAMELLIA-128-CFB8, CAMELLIA-128-ECB, CAMELLIA-128-OFB, CAMELLIA-192-CBC, CAMELLIA-192-CFB, CAMELLIA-192-CFB1, CAMELLIA-192-CFB8, CAMELLIA- 192-ECB, CAMELLIA-192-OFB, CAMELLIA-256-CBC, CAMELLIA-256-CFB, CAMELLIA-256-CFB1, CAMELLIA-256-CFB8, CAMELLIA-256-ECB, CAMELLIA-256-OFB, CAST5-CBC, CAST5-CFB, CAST5-ECB, CAST5-OFB, DES-CBC, DES-CFB, DES-CFB1, DES-CFB8, DES-ECB, DES-EDE, DES-EDE-CBC, DES-EDE-CFB, DES- EDE-OFB, DES-EDE3, DES-EDE3-CBC, DES-EDE3-CFB, DES-EDE3-CFB1, DES-EDE3-CFB8, DES-EDE3-OFB, DES-OFB, DESX-CBC, RC2-40- CBC, RC2-64-CBC, RC2-CBC, RC2-CFB, RC2-ECB, RC2-OFB, RC4, RC4-40, SEED-CBC, SEED-CFB, SEED-E CB, SEED-OFB, aes-128-cbc, aes-128-cfb, aes-128-cfb1, aes-128-cfb8, aes-128-ecb, aes-128-ofb, aes-192-cbc, aes- 192-cfb, aes-192-cfb1, aes-192-cfb8, aes-192-ecb, aes-192-ofb, aes-256-cbc, aes-256-cfb, aes-256-cfb1, aes-256- cfb8, aes-256-ecb, aes-256-ofb, bf-cbc, bf-cfb, bf-ecb, bf-ofb, камелия-128-cbc, камелия-128-cfb, камелия-128-cfb1, камелия- 128-cfb8, камелия-128-ecb, камелия-128-ofb, камелия-192-cbc, камелия-192-cfb, камелия-192-cfb1, камелия-192-cfb8, камелия-192-экб, камелия-192- ofb, камелия-256-cbc, камелия-256-cfb, камелия-256-cfb1, камелия-256-cfb8, камелия-256-ecb, камелия-256-ofb, cast5-cbc, cast5-cfb, cast5-ecb, cast5-ofb, des-cbc, des-cfb, des-cfb1, des-cfb8, des-ecb, des-ede, des-ede-cbc, des-ede-cfb, des-ede-ofb, des-ede3, des-ede3-cbc, des-ede3-cfb, des-ede3-cfb1, des-ede3-cfb8, des-ede3-ofb, des-ofb, desx-cbc, rc2-40-cbc, rc2-64-cbc, rc2-cbc, rc2-cfb, rc2-ecb, rc2-ofb, rc4, rc4-40, seed-cbc, seed-cfb, seed-ecb, seed-ofb

ВАЖНО ОБНОВЛЕНИЕ !!!

Спасибо Хобо и Джорвину за то, что они указали, что в PHP 5.3.3> есть новый параметр, который делает эту функцию немного более безопасной.

Джорвин ссылался на эту ссылку в в своем комментарии , и вот выдержка, которая применима:

В 5.3.3 они добавили новый параметр, string $iv (вектор инициализации) Действительными параметрами являются: string openssl_encrypt ( string $data , string $method , string $password, bool $raw_output = false, string $iv )

Если $iv отсутствует, выдается предупреждение: «Использование пустого вектора инициализации (iv) потенциально небезопасно и не рекомендуется».

Если $iv слишком короткое, другое предупреждение: «Переданный IV имеет длину всего 3 байта, шифр ожидает IV ровно 8 байтов с заполнением \ 0»

, тот же IV следует использовать в openssl_decrypt()

115
задан the Tin Man 8 November 2013 в 06:04
поделиться

4 ответа

Я рекомендую вместо этого использовать sort_by:

objects.sort_by {|obj| obj.attribute}

Особенно, если атрибут может быть вычислен.

Или более краткий подход:

objects.sort_by(&:attribute)
199
ответ дан 24 November 2019 в 02:21
поделиться
-2
ответ дан 24 November 2019 в 02:21
поделиться

Сортировка массива # работает хорошо , как указано выше:

myarray.sort! { |a, b|  a.attribute <=> b.attribute }

НО, вам необходимо убедиться, что для этого атрибута реализован оператор <=> . Если это собственный тип данных Ruby, это не проблема. В противном случае напишите собственную реализацию, которая возвращает -1, если a b.

10
ответ дан 24 November 2019 в 02:21
поделиться

Да, использовать Array # sort! это просто.

myarray.sort! { |a, b|  a.attribute <=> b.attribute }
34
ответ дан 24 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: