.hash字符串方法如何工作?

Ye *_*ung 8 ruby hash

我只是红宝石的新手.我见过一个字符串方法(String).hash.

例如,在irb,我尝试过

>> "mgpyone".hash
Run Code Online (Sandbox Code Playgroud)

回报

=> 144611910
Run Code Online (Sandbox Code Playgroud)

这个方法有什么用?

Mar*_*rth 11

hash方法是为所有对象定义的.见文档:

Fixnum为此对象生成哈希值.此函数必须具有a.eql?(b)暗示的属性a.hash == b.hash.哈希值由类使用Hash.Fixnum在使用之前,任何超出a容量的哈希值都将被截断.

因此该String.hash方法在C-Code中定义.基本上(过度简化)它只是总结了该字符串中的字符.

  • 需要认识到的一件事是,如果多次运行某个程序,哈希值就会发生变化。也就是说,它不仅仅是根据字符串中包含的字符计算哈希值。例如,尝试连续两次执行 ruby​​ -e "print 'a'.hash" 。如果你想要一个可重复的哈希值,你可以使用 Digest::MD5 之类的东西。 (3认同)

lac*_*der 5

如果您需要获得一致的散列输出,我建议不要使用'string.hash,而是考虑使用Digest::MD5,这在多实例云应用程序中是安全的,例如您可以测试这一点,如 @BenCrowell 之前的评论中提到的

从终端运行 2 次,每次都会得到不同的输出:

ruby -e "puts 'a'.hash"
Run Code Online (Sandbox Code Playgroud)

但如果你运行这个,输出将是一致的:

ruby -e "require 'digest'; puts Digest::MD5.hexdigest 'a'"
Run Code Online (Sandbox Code Playgroud)