Skip to content

Instantly share code, notes, and snippets.

View yamafaktory's full-sized avatar

Davy Duperron yamafaktory

View GitHub Profile
The solution to this problem with siphash was to reinitialize it every time you create a new hashmap. Specifically: when you create a HashMap you have to give it something that implements BuildHasher. The default way to do this is call RandomState::new, which pulls some randomness and stores it. Then whenever you go to hash something you call build_hasher on that which initializes a SipHasher13 using the state stored in the RandomState, which is different between hashmaps but always the same for the same hashmap. FxHashMap uses the other provided way to do this: BuildHasherDefault<H> implements BuildHasher as long as H implements Hasher + Default.
But we could be doing the same thing for FxHasher we do for SipHasher13, just initializing them to a value that's randomly chosen on HashMap creation. That solves the reinsertion performance problem without any impact on hashing performance. There's just currently no simple way to get that functionality into something that implements BuildHasher if all you have is
@yamafaktory
yamafaktory / packed.zig
Created November 25, 2024 10:47
Check if type T is a packed struct at comptime in Zig
// Check if type T is a packed struct at comptime.
comptime {
assert(@typeInfo(T) == .Struct);
assert(@typeInfo(T).Struct.backing_integer != null);
}