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
。因此,当使用tuple
h
调用
hash
时,是一个
Int
,但内部tuple
hash
函数需要一个
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
,因为这在一般情况下是不正确的。两个对象可以返回相同的哈希代码,但不能相等。