首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`Hash#hash`和`Hash#initialize_copy`是如何工作的?

`Hash#hash`和`Hash#initialize_copy`是如何工作的?
EN

Stack Overflow用户
提问于 2013-01-14 12:57:21
回答 2查看 236关注 0票数 0

我找到了一个实例方法Hash#initialize_copy。但没有任何记录。有人能在这方面帮我一些代码吗?

Hash#hash是如何计算哈希码的?背后的逻辑是什么?使用哈希代码的场景是什么?哈希的每个键,比如h,总是有不同的哈希码吗?

编辑

我尝试了以下几点:

代码语言:javascript
复制
C:\Documents and Settings\rakshiar>irb
irb(main):001:0> h=Hash.new
=> {}
irb(main):002:0> h["a"]=2
=> 2
irb(main):003:0> h["b"]=2
=> 2
irb(main):004:0> "a".hash
=> 100
irb(main):005:0> "b".hash
=> 101
irb(main):006:0> h1=Hash.new
=> {}
irb(main):007:0> h1["a"]=2
=> 2
irb(main):008:0> h1["b"]=2
=> 2
irb(main):009:0> "a".hash
=> 100
irb(main):010:0> "b".hash
=> 101
irb(main):011:0> exit

但是您可以看到,两个散列- h and h1具有相同的key/value组合。但它们的哈希码又是如何相同的呢?文件里也提到了-我知道。但原因是什么?-谁能澄清一下?

EN

回答 2

Stack Overflow用户

发布于 2013-01-14 13:21:44

What are the scenarios where hash codes are used?

记住:"b ={}"?现在,b是一个散列,每次您在其中插入某些内容时,都会使用散列代码来放置新元素。例如,也可以通过键和几乎所有其他哈希操作获得值。

Does each key of a hash, say h, always have different hash code?

不那几乎是不可能的。但是,当碰撞发生时,不同的算法可以(而且是)应用,因此,具有相同散列的两个元素将永远不会相互替换。

How does Hash#hash compute hash code?What is the logic behind it?

这是一个有点宽泛和普遍的问题,因为散列是针对不同类型的对象计算的。真正重要的是为此调用了方法hash。因此,如果重写此方法,则可以将对象的哈希代码设置为任何您想要的。

票数 2
EN

Stack Overflow用户

发布于 2013-01-14 14:04:13

基本上,initialize_copy做的是clonedup (乔恩·莱顿在博客上写了这件事)使用的一些内部内容。正如他所指出的,你真的不需要担心它在做什么,但是如果你真的很好奇,你可以通过来源进行挖掘。

关于第二点,我认为您在Hash类和hash方法之间搞混了。

Hash类是我们都知道和喜爱的数据结构。

hash方法在每个对象上定义,并返回该对象的“哈希代码”。不同类型的对象可能有不同的哈希代码计算方法。Hash数据结构内部使用这些代码来查找键(有关这些“哈希表”的更多信息,请参见维基百科 )。

这就是为什么在您的示例中,"a".hash总是相同的(重要的是,总是与“b”.hash不同)--这是因为"a".hash (方法)不受hh2 ( Hashes)的影响(尽管它在Hash中使用)。

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

https://stackoverflow.com/questions/14318850

复制
相关文章

相似问题

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