У Ruby 1.8 и 1.9 одинаковый хеш-код для строки - PullRequest
10 голосов
/ 15 декабря 2010

Я хочу использовать String.hash для генерации хеш-кода, но я боюсь, что если через некоторое время я обновлю версию с 1.8 до 1.9, сгенерированный хеш-код также изменится.

ВыполнитьRuby 1.8 и 1.9 имеют одинаковый хеш-код для строки?

1 Ответ

18 голосов
/ 15 декабря 2010

К счастью, ответ прост, потому что они не:

~$ ruby1.8 -e 'p "hello world".hash'
444332266
~$ ruby1.9 -e 'p "hello world".hash'
-194819219

Если вы используете встроенный метод хеширования, я бы порекомендовал иметь сценарий как часть вашего процесса сборки, который генерирует необходимые хеш-коды.Обратите внимание, что они не обязательно будут одинаковыми даже от одной машины к другой.

Если вам нужно постоянное хеширование, используйте что-то вроде CRC32 или SHA1 :

>> require 'zlib'
>> Zlib.crc32 "hello world"
=> 222957957
>> require 'digest'
>> Digest::SHA1.hexdigest "hello world"
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
>> Digest::MD5.hexdigest "hello world"
=> "5eb63bbbe01eeed093cb22bb8f5acdc3"

Они имеют совершенно разные цели, но CRC32 имеет преимущество в том, что возвращает 32-битное число и является достаточно быстрым, в то время как SHA1 является 80-битным, но более безопасным.(Я предполагаю, что это не для криптографических целей, но посмотрите на SHA-256, если вам это нужно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...