【问题标题】:C++ std::hash return typeC++ std::hash 返回类型
【发布时间】:2021-06-07 17:09:44
【问题描述】:

所以我一直在阅读很多关于 std::hash 的使用及其标准实现的文章、文档页面、帖子、基准测试等。

概要

看着herestd::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


【解决方案1】:

size_t 被定义为能够容纳最大对象的大小。这意味着如果您正在使用size_t 为 2 个字节的系统,您的字符串将非常短。通常size_t与指针大小相同,在32位系统上为4字节,在64位系统上为8字节。这可能就足够了。

话虽如此,如果您认为这还不够,您可以创建自己的 Hash 类,而 STL 中的所有内容都允许您传递该自定义类而不是专门化 std::hash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 2011-12-22
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多