Почему 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 с такими же спецификациями и сборкой.

25
задан Brad 21 July 2011 в 23:01
поделиться

1 ответ

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

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

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

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

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

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

25
ответ дан 28 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

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