【发布时间】: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