💡 原文中文,约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在哈希值计算策略上的不同,强调了在高性能场景下的优化需求。
➡️

继续阅读