我找到了一个实例方法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
组合。但他们的哈希码如何也一样?它也在文件中提到 - 我知道。但是原因是什么? - 有人澄清了吗?
答案 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
执行clone
和dup
(Jon Leighton has blogged about it)使用的一些内部内容。正如他所指出的那样,你并不需要担心它在做什么,但如果你真的很好奇,你可以挖掘source。
至于你的第二点,我认为你在Hash
课程和hash
方法之间感到困惑。
Hash
这个课程是我们都知道和喜爱的数据结构。
hash
该方法在每个对象上定义,并返回该对象的“哈希码”。不同类型的对象可以具有计算哈希码的不同方式。 Hash
数据结构在内部使用这些代码来查找密钥(有关这些“哈希表”的更多信息,请参阅Wikipedia)。
这就是为什么在你的例子"a".hash
总是相同的(并且,重要的是,总是与“b”.hash不同) - 这是因为"a".hash
(方法)不受影响(尽管它用于h
和h2
(Hash
es)。