-
Notifications
You must be signed in to change notification settings - Fork 6
Description
I've not run benchmarks.
But I would assume it is much faster to hash the pointer than to hash the string.
So it might be worth adding back in a wrapper type, just to make dict lookups faster.
Dumping from Slack:
Lyndon White [11:43 AM]
Anyone have any idea on the easiest way to construct a Dict with a custom hash function? (edited)
My current thoughts are to create a wrapper type for my key's type.
Give it a convert (Dicts automatically call convert on their keys during get index iirc).
And give that wrapper type the custom hash.
but I think this would be allocating, which kinda defeats the purpose of using a custom hash, to be faster.Eric Davies [11:47 AM]
I don't think that would have a multiple of extra allocationsLyndon White [11:48 AM]
wouldn't it result in 1 allocation per getindex?
I guess that isn't too bad, getindex already does a few allocations iircEric Davies [11:49 AM]
If you have the key type be a parametric type I don't think it should? because then the caller function can expect a value of that type and allocate on the stackLyndon White [11:50 AM]
Cool, I should benchmark it (edited)Eric Davies [11:54 AM]
This is what I was thinking, not sure if you thought the same:struct KeyType{K} val::K end struct MyDict{K, V} <: AbstractDict{K, V} inner::Dict{KeyType{K}, V} end @inline Base.hash(kt::KeyType, h::UInt) = myhash(kt.val, h::UInt) # rest as you describedLyndon White [11:55 AM]
I was thinking just using a normal Dict, as I don't want to have to implement the whole interface (or will inheritting AbstractDict do that for me?)
(No it won't it doesn't know about inner)
If it works, I should add anAssumeInternedtype back into InternedStrings.jl.
Which would makehash(s::AssumeInterned) = hash(pointer(s.val))andisequals(a::AssumeInterned, b::AssumeInterned) = isequal(pointer(a.val), pointer(b.val))Eric Davies [11:59 AM]
Hmm that should work you're right