【问题标题】:Do Ruby 1.8 and 1.9 have the same hash code for a string?Ruby 1.8 和 1.9 是否具有相同的字符串哈希码?
【发布时间】:2010-12-15 16:15:39
【问题描述】:

我想用String.hash来生成哈希码,但我担心如果以后我将版本从1.8升级到1.9,生成的哈希码也会改变。

Ruby 1.8 和 1.9 是否具有相同的字符串哈希码?

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    幸运的是,答案很简单,因为他们没有:

    ~$ ruby1.8 -e 'p "hello world".hash'
    444332266
    ~$ ruby1.9 -e 'p "hello world".hash'
    -194819219
    

    如果您使用内置哈希方法,我建议您将脚本作为生成必要哈希码的构建过程的一部分。请注意,即使从一台机器到另一台机器,也不能保证它们是相同的。

    如果您需要一致的哈希,请使用 CRC32SHA1 之类的东西:

    >> require 'zlib'
    >> Zlib.crc32 "hello world"
    => 222957957
    >> require 'digest'
    >> Digest::SHA1.hexdigest "hello world"
    => "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
    >> Digest::MD5.hexdigest "hello world"
    => "5eb63bbbe01eeed093cb22bb8f5acdc3"
    

    它们的用途完全不同,但 CRC32 的优点是返回一个 32 位数字并且速度相当快,而 SHA1 是一个 80 位数字但更安全。 (我假设这不是出于加密目的,但如果需要,请查看 SHA-256。)

    【讨论】:

    • 非常感谢,现在我可以确定 ruby​​ 哈希函数不可靠。我应该选择自己的哈希函数来生成像红宝石哈希码这样的代码。你有什么建议吗? :-) 我又添加了一个问题?
    • 但是我应该使用哪个函数? MD5 SHA 还是其他?非常感谢。
    • @ywenbo 我也回答过了。
    • Ruby #hash 方法对其预期用途完全可靠:获取对象的哈希值,以便 Ruby 可以在内部使用它们来填充内存中的数据结构,例如 Hash 的实例.
    猜你喜欢
    • 2011-07-20
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多