繁体   English   中英

如何找出我的 C++ 编译器用于 std::hash 的特定算法?

[英]How to find out the specific algorithm my C++ compilers use for std::hash?

我有一个以前仅用于 Mac 的代码,它使用std::hash<std::string> [1] 生成校验和。 现在此代码已移植到 Windows。 Mac 版本使用 CLANG,Windows 端口使用 GCC g++ 编译。 正如预期的那样( std::hash依赖于实现),两个编译器的结果不同:

# Windows: g++.exe (Rev2, Built by MSYS2 project) 9.2.0
std::hash("hello world"): 5577293430985752569
# Mac: Apple clang version 11.0.3 (clang-1103.0.32.29)
std::hash("hello world"): 12386028635079221413

如何找出我的编译器使用的算法?

我能想到的唯一解决方案是探测一些测试字符串上的所有哈希函数实现,看看哪些匹配......

当然,对此的长期方法是在两个端口中使用相同的加密散列函数。 但目前无法重新计算 Mac 版本迄今为止创建的所有校验和,并且必须通过 Windows 端口进行验证。


[1] 是的,首先将std::hash用于此任务是一个糟糕的选择。

正如您所说,将std::hash用于此功能可能是一个糟糕的选择。 它不仅不是跨平台的,而且实现可能会改变它们从一个版本到另一个版本的散列方式。 事实上,正如@JohnFilleau 指出的那样,对于不同的程序运行,它们甚至不必相同。

为了直接回答您的问题,哈希实现不是编译器的一部分,而是标准库实现的一部分。 在 Mac 上,您几乎肯定会使用 libc++,并且哈希实现在这里 在 Windows 上,您应该能够在此处找到实现。

对于这两种情况,您需要进行更多搜索——这些只是起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM