Сегодня мы столкнулись с этим в приложении, которое мы развертываем на многих серверах. Я хешировал несколько строк для хранения в общем хранилище ключей / значений. Метод .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 с такими же спецификациями и сборкой.
От разработчика Ruby на форуме Ruby :
Предполагается. В Ruby 1.9 явно используется локальное случайное начальное число сеанса для вычисления хэша для строк (и некоторых других объектов).
Это связано с тем, что реализация хэша Object # отличается в разных версиях (например, 1.9.1 и 1.9.2) и реализациях (например, JRuby, Rubinius, IronRuby и т. Д.). Мы хотим, чтобы люди писали переносимый код вокруг Object # hash, поэтому мы так и сделали.
Вы должны использовать Digest :: SHA256 или некоторые другие процедуры дайджеста, когда вам нужно какое-то хеш-значение (дайджест сообщения).
И продолжение работы другого разработчика:
Кроме того, это помогает избежать некоторых атак типа «отказ в обслуживании», таких как регистрация сотен и тысяч пользователей с именами пользователей, которые имеют одинаковый хэш код.