`
山雨欲来风满楼
  • 浏览: 57301 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

发现 ruby 在迭代环境下 hash计算的一个bug

    博客分类:
  • ruby
阅读更多
(2..40).step(2).each do |j|
  t=Hash.new
  t[:test]="test"
  puts  t[:test].hash
puts "test".hash
end

请你连续运行多次, 你会发现每一次你得到的hash值都不一样,有高手可以解决这个问题吗?

有可能是ruby语言的一个惊天bug。
0
0
分享到:
评论
11 楼 Hooopo 2009-11-23  
你要多次用可以base64啊
10 楼 山雨欲来风满楼 2009-11-23  
也就是hash值只能临时有用, 这个有待改进。
9 楼 night_stalker 2009-11-23  
弄错了一点,更正下 …… 算 string 的 hash 时是不用内存指针的

但是有个随机数种子,每次重新启动 ruby 解释器的时候会重新生成一遍。
8 楼 night_stalker 2009-11-23  
lz 的意思是不是运行,关闭,再运行的结果不一样?
ruby 1.9 相等的字符串的 hash 在同一个程序中,是严格一致的,但在不同的程序中可以不一样。(和 java 的 hashCode 算法不同)
如果想得到任何程序都保持一致的特征值,最好用别的摘要算法 ……

算 hash 的时候用了内存指针(参见 string.c 里面带 hash 的几个函数)。
所以我是 -664492887 而 hooopo 是 -796561225,但 "test".hash == "test".hash 是恒成立的 ……
7 楼 dennis_zane 2009-11-23  
按理说是不会有这样的问题的,不然hash表根本没法用了
6 楼 Hooopo 2009-11-23  
]
C:\TDDOWNLOAD\ruby-1.9.1-p129-i386-mswin32\bin>ruby -v
ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]

C:\TDDOWNLOAD\ruby-1.9.1-p129-i386-mswin32\bin>irb
Hello Hooopo!
irb(main):001:0> (2..40).each  {|i| puts "test".hash}
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
-796561225
=> 2..40
irb(main):002:0>


1.9.1和1.8.6都试过没有这个问题...
5 楼 dennis_zane 2009-11-23  
没回复清楚 ,我说是在1.8.6上测试,hash值都是一样的。
1.9的String#hash算法修改了,不知道有没有关联,应该找源码看下。
4 楼 山雨欲来风满楼 2009-11-22  
到那里去提这个 ruby hash 计算的bug? 这个东西会害死好多人的,我就花了2个小时来调试,没有想到是bug
3 楼 dennis_zane 2009-11-22  
在ruby 1.8.6测试结果是完全一样的。
2 楼 山雨欲来风满楼 2009-11-22  
无奈下, 只好用crc32方法来计算, 暂时绕过去吧。
1 楼 山雨欲来风满楼 2009-11-22  
(2..40).each  {|i| puts "test".hash}

无论在什么循环中,输出的hash值,每次运行结果不一样,我用的是 Ruby 1.9.1

相关推荐

Global site tag (gtag.js) - Google Analytics