2011-07-21 1 views
24

Nous sommes arrivés aujourd'hui sur une application que nous déployons sur de nombreux serveurs. Je devais hacher certaines chaînes pour les stocker dans un magasin à clé/valeur partagée. La méthode .hash de String retourne différents entiers en fonction du serveur. Des idées pourquoi? Notez que je suis intéressé par pourquoi; pas possible de contourner les travaux.Pourquoi Ruby String.hash est-il incohérent entre les machines?

Exemple:

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 

Ces machines sont des instances EC2 avec les mêmes spécifications et construire.

+0

Nous nous demandons si vous pouvez également afficher la valeur de 'RUBY_VERSION' dans' 'irb'. – GarlicFries

+0

Par exemple: 'ruby-1.9.2-p290: 002> RUBY_VERSION => "1.9.2"' ' – GarlicFries

+0

irb (principaux): 001: 0> RUBY_VERSION => "1.9.2"' pour les deux – Brad

Répondre

23

Du même dev Ruby dans le Ruby forum:

Il est destiné. Ruby 1.9 utilise explicitement la graine aléatoire locale de la session pour calculer un hachage pour les chaînes (et quelques autres objets).

En effet, la mise en œuvre de hachage objet # est différent entre versions (comme 1.9.1 et 1.9.2) et les mises en œuvre (comme JRuby, Rubinius, IronRuby, etc.). Nous voulons que les gens écrivent du code portable autour de l'objet # hash, donc nous l'avons fait.

Vous devez utiliser Digest :: SHA256 ou d'autres routines de résumé lorsque vous voulez vouloir une valeur de hachage (résumé du message).

Et suivi d'un autre dev:

, il contribue également à éviter certaines des attaques par déni de service, tels que enregistrement des centaines et des milliers d'utilisateurs avec les noms d'utilisateurs qui ont le même code de hachage .

+0

Oui, mon "travail autour" était d'utiliser Digest mais cela semblait étrange venant d'un arrière-plan Java. – Brad

Questions connexes