为什么我的哈希值具有映射到多个值的相同键?

use*_*626 1 ruby arrays hash

我有一个哈希,将整数数组映射到整数.由于某种原因,哈希有一个键映射到多个值,如:

{[1,2]=>3, [1,2]=> 4}
Run Code Online (Sandbox Code Playgroud)

我怎样才能防止这种情况发生?运行

for key, value in map
    puts key.inspect + "=>" + value.inspect + ":" + key.hash.inspect
end
Run Code Online (Sandbox Code Playgroud)

给我

[1, 2]=>11:11
[0, 4, 6, 8, 9]=>10:253
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]=>15:11189
[0, 3, 4, 6, 7, 8, 9]=>13:981
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]=>14:11189
[0, 1, 2, 4, 5, 6, 7, 8, 9]=>12:4661
Run Code Online (Sandbox Code Playgroud)

ste*_*lag 5

我可以想到两个案例.第一个是模糊的compare_by_identity开启.不知道该怎么办.不要打开它?将所有内容复制到普通哈希?

h={}
h.compare_by_identity
h[[1,2]]=2
h[[1,2]]=3
p h #=> {[1, 2]=>2, [1, 2]=>3}
Run Code Online (Sandbox Code Playgroud)

第二种情况更合理:密钥在放入哈希后会发生变化.

h={}
h[[1,2,3]]=2
h[[1,2]]=3
h.keys.first.pop # assuming ruby 1.9
p h #=> {[1, 2]=>2, [1, 2]=>3}
Run Code Online (Sandbox Code Playgroud)

这很容易补救(但也容易忘记):

h.rehash
p h #=> {[1, 2]=>3}
Run Code Online (Sandbox Code Playgroud)