boost :: hash_combine vs simple XOR'

时间:2015-04-26 21:33:18

标签: c++ boost hash

使用boost库时,功能boost::hash_combine的工作方式如下:

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);

http://www.boost.org/doc/libs/1_46_1/doc/html/hash/reference.html#boost.hash_combine

这种方法与简单的XOR-ing相比有什么优势?

使用XOR-ing,甚至可以使用散列函数将无序容器用作键,而这个是依赖于顺序的。

1 个答案:

答案 0 :(得分:4)

有许多有序的容器,例如列表。如果您使用XOR,那么您基本上会说[0, 1][1, 0]相同。显然情况并非如此。覆盖无序容器的方法比强加一个会为有序容器创建大量碰撞的方法容易得多。 XOR还有很多其他令人讨厌的属性。例如,如果您有重复的元素,那么它们将相互抵消。

最后,哈希的想法是合理地确定你没有为多个元素获得相同的值。 XOR本身不适合该属性。