Почему Ruby String.hash несовместим на разных машинах? - PullRequest
25 голосов
/ 22 июля 2011

Сегодня мы столкнулись с этим в приложении, которое мы развернули на многих серверах.Я хэшировал некоторые строки для хранения в общем хранилище ключей / значений.Метод .hash для String возвращает разные целые числа в зависимости от сервера.Есть идеи почему?Обратите внимание, что меня интересует , почему ;невозможные обходные пути.

Пример:

server1 $ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]

server1 $ irb
irb(main):001:0> "test".hash
=> 4146582576695053125


server2 $ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]

server2 $ irb
"test".hash
=> 3479379392688537032

Эти машины представляют собой экземпляры EC2 с одинаковыми характеристиками и сборкой.

1 Ответ

25 голосов
/ 22 июля 2011

От разработчика Ruby на форуме Ruby :

предназначен. Ruby 1.9 явно использует локальное случайное начальное число сеанса для вычислить хеш для строк (и некоторых других объектов).

Это потому, что реализация Object # hash отличается версии (например, 1.9.1 и 1.9.2) и реализации (например, JRuby, Рубинус, IronRuby и тд). Мы хотим, чтобы люди писали переносимый код вокруг Object # hash, так мы и сделали.

Вы должны использовать Digest :: SHA256 или некоторые другие процедуры дайджеста, когда вы требуется некоторое значение хеша (дайджест сообщения).

И продолжение работы другого разработчика:

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

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