`
山雨欲来风满楼
  • 浏览: 58012 次
  • 性别: 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

相关推荐

    geohash:一个解决计算附近距离的php类库

    在IT行业中,尤其是在Web开发领域,地理定位和距离计算是一个重要的功能,特别是在提供地图服务、推荐系统、社交网络和本地搜索应用中。`geohash`是一个非常实用的技术,它利用了空间数据索引和编码策略,使得在PHP...

    深空Hash计算工具 深空Hash计算工具

    深空Hash计算工具

    哈希计算工具 java-hash.7z

    哈希计算工具 `java-hash.7z` 是一个专门用于进行哈希运算的软件包,主要服务于编程领域,特别是Java开发者。哈希计算在信息技术中扮演着至关重要的角色,它能够将任意大小的数据映射为固定长度的哈希值,这个值通常...

    支持文件和文件夹的Hash计算工具

    多线程hash计算工具。安全可靠,电子数据提取固定必备。支持多线程MD5、SHA256、SHA512等多种hash计算,支持批量计算。

    文件hash算法,对大文件进行hash计算

    Base64是一种编码方式,它使用64个字符(包含大小写字母、数字和两个特殊符号)来表示任意二进制数据,使得哈希值可以在电子邮件、文本文件等场景下使用。 在软件开发中,例如“FileHashCalc”这样的工具或函数,...

    hash值计算工具

    哈希值计算工具是一种在IT领域中广泛应用的实用软件,主要用于数据校验和信息完整性验证。哈希(Hash)函数,又称为散列函数,它能够将任意长度的数据转化为固定长度的输出,这个输出通常被称为哈希值或消息摘要。在...

    SHA256 HASH计算方法,大文件、小文件、流式读取计算

    SHA256 HASH计算方法,大文件、小文件、流式读取计算

    geohash:一个解决计算附近距离的php类库.zip

    在实际应用中,Geohash可以和数据库结合使用,例如在MySQL中创建一个索引字段来存储Geohash值,从而提高地理位置查询的效率。在高并发和大数据量的情况下,这种优化策略显得尤为重要,因为它减少了昂贵的空间距离...

    深空HASH计算工具 V2.0

    深空HASH计算工具,用于计算HASH值的一款工具,非常好用。

    Ruby 迭代器知识汇总

    Ruby 迭代器是编程语言中的一个重要概念,它允许我们遍历并处理集合中的每一个元素。在Ruby中,数组和哈希都被视为集合,而迭代器则是这些集合操作的核心工具。本文将深入探讨Ruby中的两种主要迭代器:each和collect...

    springboot+mybatis实现迭代慢hash验证登录.rar

    springboot+mybatis实现迭代慢hash验证登录,附带慢hash验证工具类,亲测可用!!!

    MD5-SHA1-CRC32-Hash计算

    这个"Hash计算"小工具包含的Hash.exe程序,很可能是一个用户友好的图形界面应用程序,允许用户选择本地文件,然后一键计算该文件的MD5、SHA1和CRC32散列值。这样的工具对于验证下载文件的完整性、对比文件是否一致...

    Ruby-OhmRedis的Objecthash映射库

    Ruby是一种动态、面向对象的编程语言,而Ohm是针对Ruby设计的一个ORM(对象关系映射)/ODM(对象数据映射)框架,专门用于与Redis这种内存数据存储进行交互。Ohm允许开发者以简洁的Ruby代码操作Redis的数据结构,...

    Hash值计算工具图表易换,免杀技术,密码算法,加密工具。

    Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash值计算工具Hash...

    hashin失效vumat_hashin破坏准则_vumatfailure_vumathashin失效_hashin_vumat

    在VUMAT中集成Hashin失效准则,可以精确模拟复合材料在不同载荷下的失效过程,例如在土木工程中预测结构在地震或风荷载下的响应,或者在航空航天领域分析飞行器的耐久性。 在“hashinʧ Чvumat.txt”这个文件中,...

    文件hash值计算软件

    标题中的"文件hash值计算软件"指的就是这样一种工具,它可以为任何文件生成一个唯一的数字指纹,这个指纹就是哈希值。在本例中,描述中的"文件MD5值计算,拉动即可"表明该软件支持MD5哈希算法,并且操作简单,只需...

    HASH计算小工具

    哈希计算工具,支持:文件,文本字符串,十六进制字符串的数据格式。支持:MD5,MD4,SHA1,SHA256,SHA384,SHA512,RIPEMD160,PANAMA,TIGER,MD2,ADLER32,CRC32等算法。 备注:只是工具,不带源码。

    Ruby-Phashion是围绕pHash库的一个Ruby封装

    Ruby-Phashion是一个Ruby语言的库,它是对pHash库的封装,主要目的是在Ruby环境中提供图像和音频的相似度比较功能。pHash库是一种开源软件,它利用数字信号处理技术来计算媒体文件(如图片和音频)的哈希值,从而...

    HASH值计算工具

    在描述中提到了"Hash_1.0.4_XiaZaiBa.exe",这很可能是一个特定版本的哈希值计算软件的可执行文件,版本号为1.0.4,可能由“下载吧”提供。用户可以通过运行这个.exe文件来计算文件的哈希值,例如验证下载的文件是否...

Global site tag (gtag.js) - Google Analytics