💡
原文中文,约3400字,阅读约需8分钟。
📝
内容提要
本文分析了C++中std::unordered_map的键(如int、float、指针和std::string)如何计算哈希值。gcc和clang在实现上存在差异,gcc使用murmurhash,而clang在64位系统下使用cityhash64。对于浮点数和指针,gcc将其视为size_t,clang则使用hash_bytes操作。总结了两者在性能和精度上的不同。
🎯
关键要点
- 本文分析了C++中std::unordered_map的键如何计算哈希值。
- gcc和clang在实现上存在差异,gcc使用murmurhash,而clang在64位系统下使用cityhash64。
- std::string的哈希逻辑依赖于底层字节序列的通用hash操作,称为hash_bytes。
- 整型的哈希计算分为两种情况,sizeof(T) <= sizeof(size_t)和sizeof(T) > sizeof(size_t)。
- 当sizeof(T) <= sizeof(size_t)时,直接将key的值作为hash值。
- 当sizeof(T) > sizeof(size_t)时,gcc和clang的处理方式不同,gcc可能导致精度损失,而clang使用hash_bytes计算。
- 对于浮点数,gcc将其视为bytes进行hash_bytes计算,而clang则根据sizeof(T)的不同进行不同处理。
- clang在64位机器下对float和double的处理更高效,避免了精度损失。
- 对于指针,gcc直接将指针视为size_t,而clang则使用hash_bytes计算,避免hash冲突。
- 总结了gcc和clang在哈希值计算策略上的不同,强调了在高性能场景下的优化需求。
➡️