boost :: hash_combine vs simple XOR'ing

k_l*_*k_l 8 c++ hash boost

使用boost库时,功能boost::hash_combine如下:

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Maa*_*wes 4

有许多有序的容器,例如列表。如果您使用 XOR 那么您基本上会说这[0, 1]与 相同[1, 0]。显然事实并非如此。重写无序容器的方法比为有序容器强加会产生大量冲突的方法要容易得多。XOR 还有很多其他令人讨厌的特性。例如,如果您有重复的元素,那么它们将相互抵消。

最后,哈希的想法是合理地确保多个元素不会获得相同的值。XOR 本身并不适合该属性。