3
# 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]

4

1 回答 1

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 进程中总是相同的。

于 2012-08-29T06:26:48.507 回答