Default hashing function for AA's

Robert M. Münch robert.muench at saphirion.com
Thu May 31 12:31:33 UTC 2018


On 2017-10-10 15:22:05 +0000, Steven Schveighoffer said:

> AA uses typeid(Key).getHash. [1]
> 
> For objects, this calls the virtual function `toHash`. [2]
> 
> Please keep in mind that all you are hashing is the class reference 
> pointer, as that is the default comparison for `opEquals`. It might 
> make sense to shuffle those bits a bit, since the bucket algorithm only 
> looks at the lower bits of the hash, and this basically guarantees keys 
> with the default hash will be empty in the first few buckets, since 
> class objects are aligned on a power-of-2 boundary.
> 
> But I'm not sure running a full blown hash on the pointer is necessary. 
> Perhaps just xor-ing the upper bits with the lower bits makes more 
> sense.
> 
> Alternatively, you could change the default `opEquals` but that may 
> break things more than expected.
> 
> What you *can't* do is change what the hash is based on without 
> changing `opEquals`.
> 
> Note that I wouldn't recommend using an Object as a key without 
> defining toHash and opEquals anyway.
> 
> -Steve
> 
> [1] https://github.com/dlang/druntime/blob/master/src/rt/aaA.d#L310
> [2] https://github.com/dlang/druntime/blob/master/src/object.d#L66

Not sure this thread fits or a new one would be better. Anyway, here is 
an interesting article about a very fast hashtable and maybe it's a 
good candidate for the default AA implementation in D. IMO providing a 
very performant AA implementation is a big asset:

https://probablydance.com/2018/05/28/a-new-fast-hash-table-in-response-to-googles-new-fast-hash-table/ 



-- 
Robert M. Münch
http://www.saphirion.com
smarter | better | faster



More information about the Digitalmars-d mailing list