0

我找到了一个实例方法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组合。但是他们的哈希码怎么也一样呢?它也在文件中提到 - 我知道。但原因是什么?- 有人澄清一下吗?

4

2 回答 2

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调用了该方法。因此,如果您覆盖此方法,您可以将对象的哈希码设置为您想要的任何内容。

于 2013-01-14T13:21:44.140 回答
1

基本上,做一些和initialize_copy使用的内部东西(Jon Leighton 写过博客)。正如他所指出的,你真的不需要担心它在做什么,但如果你真的很好奇,你可以挖掘源代码clonedup

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

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

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

这就是为什么在您的示例"a".hash中始终相同(并且重要的是,始终与“b”.hash 不同)-这是因为"a".hash(方法)不受(尽管它用于)hh2Hashes)的影响。

于 2013-01-14T14:04:13.777 回答