【问题标题】:good hash function for struct key that has three ints具有三个整数的结构键的良好哈希函数
【发布时间】:2014-02-11 20:26:49
【问题描述】:

对于具有三个 int 来标识唯一结构的简单 C++ 结构,如果对 a、b 和 c 的实际值了解不多,那么什么可以是一个好的散列函数实现。我需要将结构用作 unordered_map 的键吗?

struct Key {

        int a, b, c;

    }

【问题讨论】:

  • 真的那么重要吗?你可以试试long h = (a * 10079 + b * 20047) ^ ( c *30089 ); 之类的东西或任何你想要的东西......
  • “好”是什么意思?您试图在速度与碰撞次数方面达到什么平衡?
  • 好的意思是平衡。因为我没有关于 int 属性的信息
  • 根据您使用的编译器,这不是必需的。例如,GCC 有一个 unordered_map 的实现,它对错误的输入几乎不敏感。否则,使用@BasileStarynkevitch 提出的简单乘加异或混合对于短输入来说是一个非常好的散列。更复杂的散列函数在短输入上的性能并没有显着提高(特别是具有大得离谱的块和摘要大小的函数,如 MD5 不会)。将 96 位输入散列到 128 位摘要中是一种不好的方法(因为您只会使用其中的一个子集,所以您会丢弃熵)。
  • 任何哈希表都与您的哈希函数一样好。如果您的散列函数产生大量冲突,您根本无法实现unordered_map 的性能良好。它将降级到链表级别的性能。

标签: c++ hash hash-function


【解决方案1】:

将整个结构传递给 Murmurhash:https://sites.google.com/site/murmurhash/

不要尝试自己混合这些值(例如,上面的建议是乘法、加法、异或等)。利用散列函数的全部意义在于它已经可以非常有效地混合它们。如果你预先混合,你只是带走了有用的熵。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2010-11-22
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多