【发布时间】:2010-12-15 16:15:39
【问题描述】:
我想用String.hash来生成哈希码,但我担心如果以后我将版本从1.8升级到1.9,生成的哈希码也会改变。
Ruby 1.8 和 1.9 是否具有相同的字符串哈希码?
【问题讨论】:
我想用String.hash来生成哈希码,但我担心如果以后我将版本从1.8升级到1.9,生成的哈希码也会改变。
Ruby 1.8 和 1.9 是否具有相同的字符串哈希码?
【问题讨论】:
幸运的是,答案很简单,因为他们没有:
~$ ruby1.8 -e 'p "hello world".hash'
444332266
~$ ruby1.9 -e 'p "hello world".hash'
-194819219
如果您使用内置哈希方法,我建议您将脚本作为生成必要哈希码的构建过程的一部分。请注意,即使从一台机器到另一台机器,也不能保证它们是相同的。
如果您需要一致的哈希,请使用 CRC32 或 SHA1 之类的东西:
>> 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。)
【讨论】:
#hash 方法对其预期用途完全可靠:获取对象的哈希值,以便 Ruby 可以在内部使用它们来填充内存中的数据结构,例如 Hash 的实例.