`Hash #hash`和`Hash#initialize_copy`如何工作?

时间:2013-01-14 12:57:21

标签: ruby hash

我找到了一个实例方法Hash#initialize_copy。但没有记录。有人可以用这些代码帮助我吗?

Hash#hash如何计算哈希码?它背后的逻辑是什么?使用哈希码的场景是什么?哈希的每个键(例如h)是否总是具有不同的哈希码?

编辑

我尝试了以下内容:

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组合。但他们的哈希码如何也一样?它也在文件中提到 - 我知道。但是原因是什么? - 有人澄清了吗?

2 个答案:

答案 0 :(得分:2)

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。因此,如果重写此方法,则可以将对象的哈希代码设置为您想要的任何内容。

答案 1 :(得分:1)

基本上,initialize_copy执行clonedupJon Leighton has blogged about it)使用的一些内部内容。正如他所指出的那样,你并不需要担心它在做什么,但如果你真的很好奇,你可以挖掘source

至于你的第二点,我认为你在Hash课程和hash方法之间感到困惑。

Hash这个课程是我们都知道和喜爱的数据结构。

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

这就是为什么在你的例子"a".hash总是相同的(并且,重要的是,总是与“b”.hash不同) - 这是因为"a".hash(方法)不受影响(尽管它用于hh2Hash es)。