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

Dav*_* J. 3 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
Run Code Online (Sandbox Code Playgroud)

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

我跑ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.0.0].

Dav*_* J. 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进程中始终是相同的.