Hash 自定义类型的哈希函数
我正在尝试为我构造的新类型定义一个自定义相等方法。这是我想要做的事Hash 自定义类型的哈希函数,hash,types,julia,Hash,Types,Julia,我正在尝试为我构造的新类型定义一个自定义相等方法。这是我想要做的事 mutable struct a first_num::Int second_num::Int end import Base.== import Base.hash function hash(obj::a, h=33141651) return hash((obj.first_num, obj.second_num), h) end function ==(obj1::a, obj2::a)
mutable struct a
first_num::Int
second_num::Int
end
import Base.==
import Base.hash
function hash(obj::a, h=33141651)
return hash((obj.first_num, obj.second_num), h)
end
function ==(obj1::a, obj2::a)
if hash(obj1) == hash(obj2)
return true
else
return false
end
end
a1 = a(2,3)
a2 = a(2,3)
a1 == a2
然后我得到了一个错误,比如error:TypeError:==:在typeassert中,应该是UInt64,得到Int64
h正在变成Int64吗
另外,如果对属性的元组进行散列不是正确的方法,请告诉我
编辑:实际上,我运行了这个,得到了
MethodError:没有匹配哈希的方法(::Tuple{Int64,Int64},::Int64)
。h
是否被提升为Int64?问题是h
(33141651)的文字值是Int
而不是UInt
。因此,当使用tupleh
调用hash
时,是一个Int
,但内部tuplehash
函数需要一个UInt
。我认为您根本不必为h
指定一个值,像这样的东西就足够了:
function Base.hash(obj::a, h::UInt)
return hash((obj.first_num, obj.second_num), h)
end
完整性的完整示例:
mutable struct A
first::Int
second::Int
end
function Base.hash(obj::A, h::UInt)
return hash((obj.first, obj.second), h)
end
function Base.:(==)(obj1::A, obj2::A)
return hash(obj1) == hash(obj2)
end
有以下行为
julia> a = A(2,3); b = A(2,3)
A(2, 3)
julia> hash(a)
0x965b43497b212144
julia> hash(b)
0x965b43497b212144
julia> a == b
true
我希望您不要假设
hash(obj1)==hash(obj2)
意味着obj1==obj2
,因为这在一般情况下是不正确的。两个对象可以返回相同的哈希代码,但不能相等。