Skip to content

Commit fb672da

Browse files
authored
implement a hash function for Enums (#30500)
This avoids having to make a runtime call to `objectid`.
1 parent 2159bfb commit fb672da

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

base/Enums.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,9 @@ macro enum(T::Union{Symbol,Expr}, syms...)
206206
Enums.namemap(::Type{$(esc(typename))}) = $(esc(namemap))
207207
Base.typemin(x::Type{$(esc(typename))}) = $(esc(typename))($lo)
208208
Base.typemax(x::Type{$(esc(typename))}) = $(esc(typename))($hi)
209+
let enum_hash = hash($(esc(typename)))
210+
Base.hash(x::$(esc(typename)), h::UInt) = hash(enum_hash, hash(Integer(x), h))
211+
end
209212
let insts = (Any[ $(esc(typename))(v) for v in $values ]...,)
210213
Base.instances(::Type{$(esc(typename))}) = insts
211214
end

test/enums.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ end
175175
end
176176
@test Int(haggis) == 4
177177

178+
@enum HashEnum1 Enum1_a=1
179+
@enum HashEnum2 Enum2_a=1
180+
@test hash(Enum1_a) != hash(Enum2_a)
181+
178182
@test (Vector{Fruit}(undef, 3) .= apple) == [apple, apple, apple]
179183

180184
# long, discongruous

0 commit comments

Comments
 (0)