【发布时间】:2021-06-07 17:09:44
【问题描述】:
所以我一直在阅读很多关于 std::hash 的使用及其标准实现的文章、文档页面、帖子、基准测试等。
概要
看着here,std::hash 似乎总是会返回一个std::size_t,它在here 之后是至少 16 位或2 个字节的大小,尽管它是实现-依赖。
但这让我很担心。如果我什至不能保证哈希至少为 32 位(我真的希望它返回 64 位),我该如何在字符串上使用 std::hash。
在我的特定 x64 机器上,std::size_t 被定义为 long unsigned int,但显然在我部署我的程序时这并不能保证。
问题
有没有办法解决这个问题,所以我可以确定我得到了从std::hash 返回的 64 位哈希?
结论
从 cmets 来看,std::hash 将不适合。谢谢!
【问题讨论】:
-
这可以通过制作自己的哈希来解决。但实际上,除非您计划将此代码用于微控制器,否则
std::size_t将至少为 64 位。 -
想想你要散列多少个字符串与散列大小并注意 tnat "...散列函数只需要为相同的结果产生相同的结果在程序的单次执行中输入;..." 因此无法存储哈希(在文件或数据库中)。 en.cppreference.com/w/cpp/utility/hash
-
您在寻找什么样的解决方案?例如,始终有效的解决方案?或者,一个如果它编译有效但如果它的假设被违反则拒绝编译的解决方案?还有什么?
-
另一个问题是你不能确定
std::hash使用什么算法。它可能会导致一个系统发生冲突,而不是另一个。 -
@ワイきんぐ 对于台式机、笔记本电脑和游戏机,
size_t小于 4 字节的可能性极小。
标签: c++ string hash size-t stdhash