为什么Ruby的哈希方法在运行中有所不同?

时间:2012-08-29 06:26:49

标签: ruby hash ruby-1.9

# pry / irb example #1
"abc".hash
=> -1883761119486508070
"abc".hash
=> -1883761119486508070

# pry / irb example #2
"abc".hash
=> -4309321811150053495
"abc".hash
=> -4309321811150053495

hash值对于特定调用是常量,但在调用之间会有所不同。为什么?这是设计的吗?这被认为是“好事”吗?

我正在运行ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.0.0]

1 个答案:

答案 0 :(得分:7)

根据http://patshaughnessy.net/Ruby-Under-a-Microscope-Rough-Draft-May.pdf

的第23页
  

这是Ruby的哈希函数实际上如何工作... [snip] ...对于字符串和数组,它的工作方式不同。在这种情况下,Ruby实际上遍历所有   的人物   在数组中的字符串或元素中计算累积哈希值;这保证了   对于字符串或数组的任何实例,哈希值将始终相同,并且如果有任何实例,则哈希值将始终更改   该字符串或数组中的值发生变化。

  

另外,Ruby 1.9和Ruby 2.0使用随机种子值初始化MurmurHash   每次重启Ruby时重新初始化。这意味着,如果你停止并重新启动Ruby,你将会这样做   获取相同输入数据的不同哈希值。这也意味着如果你自己尝试一下   你会得到与我上面不同的价值观。但是,哈希值将始终为   在同一个Ruby进程中也是如此。