Ruby Hash和Hash初始化拷贝是如何工作的?

Ruby Hash和Hash初始化拷贝是如何工作的?,ruby,hash,Ruby,Hash,我找到了一个实例方法Hash#initialize\u copy。但没有任何记录。在这方面,有人能帮我写一些代码吗 Hash#Hash如何计算Hash码?背后的逻辑是什么?使用哈希代码的场景是什么?散列的每个键,比如说h,总是有不同的散列码吗 编辑 我尝试了以下方法: C:\Documents and Settings\rakshiar>irb irb(main):001:0> h=Hash.new => {} irb(main):002:0> h["a"]=2 =>

我找到了一个实例方法
Hash#initialize\u copy
。但没有任何记录。在这方面,有人能帮我写一些代码吗

Hash#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

但是您可以看到两个hash-
h和h1
具有相同的
键/值组合。但它们的散列码又是如何相同的呢?文件中也提到了这一点——我知道。但原因是什么任何人请澄清?

使用哈希代码的场景是什么?

还记得这句话吗:“b={}”?现在,b是一个散列,每次你在其中插入一些东西,散列代码就用来放置新元素。例如,通过键获取值和几乎所有其他哈希操作都使用相同的方法

散列的每个键,比如h,总是有不同的散列码吗?

不,这几乎是不可能的。然而,当冲突发生时,可以(并且会)应用不同的算法,所以两个具有相同哈希的元素将不会相互替换

Hash#Hash如何计算Hash代码?它背后的逻辑是什么?


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

使用哈希代码的场景是什么?

还记得这句话吗:“b={}”?现在,b是一个散列,每次你在其中插入一些东西,散列代码就用来放置新元素。例如,通过键获取值和几乎所有其他哈希操作都使用相同的方法

散列的每个键,比如h,总是有不同的散列码吗?

不,这几乎是不可能的。然而,当冲突发生时,可以(并且会)应用不同的算法,所以两个具有相同哈希的元素将不会相互替换

Hash#Hash如何计算Hash代码?它背后的逻辑是什么?


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

基本上,
initialize\u copy
执行一些内部操作,这些操作由
clone
dup
()使用。正如他所指出的,你不需要担心它在做什么,但是如果你真的很好奇,你可以从中挖掘

至于你的第二点,我认为你在
Hash
类和
Hash
方法之间混淆了

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

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


这就是为什么在你的例子中,
“a”。hash
总是相同的(而且,重要的是,总是不同于“b”。hash)-这是因为
“a”。hash
(方法)不受(尽管它在
h
h2
(hash
es)的影响,
initialize\u copy
执行一些内部操作,这些操作由
clone
dup
()使用。正如他所指出的,你不需要担心它在做什么,但是如果你真的很好奇,你可以从中挖掘

至于你的第二点,我认为你在
Hash
类和
Hash
方法之间混淆了

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

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


这就是为什么在您的示例中,
“a”.hash
总是相同的(而且,重要的是,总是不同于“b”.hash)-这是因为
“a”.hash
(方法)不受(尽管它在
h
h2
(hashes)的影响.

如何使用哈希#哈希方法生成和查看
哈希
中每个键的
哈希代码
?要查看键的哈希代码,只需查看
键。哈希
此处
是映射中键的值。请给我一张示例地图,我可以试着帮助您。@VBSlover请查看我在您的问题
+1
下的评论,以了解您的兴趣,我很难理解这个概念!如何使用哈希#哈希方法生成和查看
哈希
中每个键的
哈希代码
?要查看键的哈希代码,只需查看
键。哈希
此处
是映射中键的值。请给我一张示例地图,我可以试着帮助您。@VBSlover请查看我在您的问题
+1
下的评论,以了解您的兴趣,我很难理解这个概念!在Ruby平台上,
Hash#initialize_copy
是如何工作的?有人能给我解释一下吗?两个相等对象的Hash代码应该总是相同的。请注意,在上面的代码中,您检查了
“a”
的哈希代码。而不是给定哈希映射中“a”的哈希代码,它实际上没有任何意义。即使密钥未放入哈希中,它也具有哈希