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

ywe*_*nbo 10 ruby hash

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

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

Jos*_*Lee 18

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

~$ ruby1.8 -e 'p "hello world".hash'
444332266
~$ ruby1.9 -e 'p "hello world".hash'
-194819219
Run Code Online (Sandbox Code Playgroud)

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

如果需要一致的散列,请使用CRC32SHA1之类的东西:

>> require 'zlib'
>> Zlib.crc32 "hello world"
=> 222957957
>> require 'digest'
>> Digest::SHA1.hexdigest "hello world"
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
>> Digest::MD5.hexdigest "hello world"
=> "5eb63bbbe01eeed093cb22bb8f5acdc3"
Run Code Online (Sandbox Code Playgroud)

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

  • Ruby`#hash`方法对于其预期用途是完全可靠的:获取对象的哈希值,以便Ruby可以在内部使用它们来填充内存数据结构,例如`Hash`的实例. (3认同)