rust-lang / hashbrown

Rust port of Google's SwissTable hash map
https://rust-lang.github.io/hashbrown
Apache License 2.0
2.42k stars 283 forks source link

Support lower maximum size #540

Open overlookmotel opened 3 months ago

overlookmotel commented 3 months ago

HashMap, HashSet and HashTable are currently all 32 bytes.

Would you consider supporting a lower maximum size? For many use cases, a size limit of ~4 billion items is sufficient, so using u32 for items, bucket_mask and growth_left would suffice. This would reduce the size of the types to 24 bytes.

This may not seem a significant gain, but when using a great number of HashMaps, with a large proportion of them empty and unallocated, the overhead adds up to a significant % of total memory usage.

This could be implemented either as a feature or generic.

If you'd be willing to accept a PR for this, I'd be happy to work one up.

cuviper commented 1 month ago

As a user, you can also add indirection like Option<Box<HashMap<...>>> so it's only a pointer-sized None when empty. That's more of a hassle to actually use, of course, but you could hide that in a wrapper for your specific use-cases.