首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby:为什么相同的字符串有不同的哈希码?

Ruby:为什么相同的字符串有不同的哈希码?
EN

Stack Overflow用户
提问于 2010-04-22 09:36:57
回答 3查看 510关注 0票数 1
代码语言:javascript
运行
复制
test = 'a'
test2 = '@a'.slice(0)
test3 = '@a'[1]

puts test.hash
puts test2.hash
puts test3.hash

输出:

代码语言:javascript
运行
复制
100
64
97

这是一个bug,还是我误解了hash方法的工作方式?有没有办法解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-22 09:47:04

这些表达式的结果并不都是相同的数据。Ruby 1.8整数包含用于单字符索引的字符数字。这在Ruby1.9中有所改变,但是slice(0)返回字符串的第一个字符'@',而不是'a'

在Ruby1.8中(使用irb):

代码语言:javascript
运行
复制
irb(main):001:0> test = 'a'
=> "a"
irb(main):002:0> test2 = '@a'.slice(0)
=> 64
irb(main):003:0> test3 = '@a'[1]
=> 97
irb(main):004:0> test.hash
=> 100
irb(main):005:0> test2.hash
=> 129
irb(main):006:0> test3.hash
=> 195

在Ruby 1.9.1中:

代码语言:javascript
运行
复制
irb(main):001:0> test = 'a'
=> "a"
irb(main):002:0> test2 = '@a'.slice(0)
=> "@"
irb(main):003:0> test3 = '@a'[1]
=> "a"
irb(main):004:0> test.hash
=> 1365935838
irb(main):005:0> test2.hash
=> 347394336
irb(main):006:0> test3.hash
=> 1365935838
票数 3
EN

Stack Overflow用户

发布于 2010-04-22 09:43:34

原因是每个变量引用不同的对象,具有自己唯一的散列码!变量test是字符串"a",test2是整数64 (‘@’的字符数),test3是整数97 ('a')。令人惊讶的是,在Ruby中,字符串的元素是整数,而不是字符串或字符。

票数 2
EN

Stack Overflow用户

发布于 2010-04-22 09:51:20

正如maerics指出的那样,除非您已经为正在使用的类定义了自己的散列方法,否则散列可能只存在于对象本身,而不是其内容。也就是说,您可以(也应该)为定义equals方法的任何类定义自己的散列方法。

在Ruby中,String类已经为您完成了这项工作:

代码语言:javascript
运行
复制
irb(main):001:0> test="a"
=> "a"
irb(main):002:0> test2="a"
=> "a"
irb(main):003:0> test.hash
=> 100
irb(main):004:0> test2.hash
=> 100
irb(main):005:0> test2[0]=test.slice(0)
=> 97
irb(main):006:0> test2
=> "a"
irb(main):007:0> test2.hash
=> 100

我还没有找到一个与Ruby相对应的文本,但是这个关于Java的页面给出了一个很好的算法来生成您自己的散列代码,这对于Ruby来说并不难复制:http://www.javapractices.com/topic/TopicAction.do?Id=28

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2687698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档