【问题标题】:Why does Ruby's hash method vary across runs?为什么 Ruby 的哈希方法在运行时会有所不同?
【发布时间】:2012-08-29 06:26:48
【问题描述】:
# 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]

【问题讨论】:

    标签: ruby hash ruby-1.9


    【解决方案1】:

    根据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 进程中相同。

    【讨论】:

    • 生成哈希时的随机种子更安全。我不记得我在哪里看到的,但我几乎可以肯定这就是发生这种情况的原因。
    • 这里是官方漏洞公告ruby-lang.org/en/news/2011/12/28/…的链接
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2013-07-28
    • 2011-03-31
    • 1970-01-01
    • 2016-06-18
    • 2014-12-31
    • 2012-08-28
    • 2020-07-08
    相关资源
    最近更新 更多