在julia语言(版本1.1.0)中,我正在试验当我改变字典键时会发生什么。
在突变之前,可变的x
和[1,2,3]
都被识别出来。
x = [1,2,3]; d = Dict(x=>"x")
haskey(d, x)
# true
haskey(d, [1,2,3])
# true
一旦我变异x
,变量x
和[1,2,3,4]
都不被识别。
push!(x, 4)
haskey(d, x)
# false
haskey(d, [1,2,3,4])
# false
haskey(d, [1,2,3])
# false
价值方面,关键是与x
“相等”,所以我猜这与哈希函数有关,但无法理解source code。
collect(keys(d))[1] == x == [1,2,3,4]
# true
有人可以解释是什么导致这种行为,或建议我应该考虑的资源?
要研究的关键功能是ht_keyindex
。
在那里你可以看到,为了找到密钥,它必须:
hashindex
)。有一个不可忽视的概率,在变换x
之后,它将具有相同的hashindex
值并且将找到密钥。例如,你可以将x
的索引4设置为5,所有看似都可以工作:
julia> x[4] = 5
5
julia> x
4-element Array{Int64,1}:
1
2
3
5
julia> haskey(d, x)
true
因此 - 在任何以类似方式支持字典的编程语言中 - 不应该改变字典的键。上述讨论应该只是理论上的讨论。