Подтвердить что ты не робот

Почему Ruby String.hash несовместим между машинами?

В этом случае мы использовали приложение, которое мы развертываем на многих серверах. Я хранил некоторые строки для хранения в общем хранилище ключей/значений. Метод .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 с теми же спецификациями и сборкой.

4b9b3361

Ответ 1

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

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

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

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

И последующие действия от другого разработчика:

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