【问题标题】:boost::hash_combine vs simple XOR'ingboost::hash_combine vs 简单异或
【发布时间】:2015-07-05 04:53:12
【问题描述】:

使用 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,甚至可以使用散列函数来使用无序容器作为键,而这个是依赖于顺序的。

【问题讨论】:

标签: c++ boost hash


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 2018-08-19
    • 2012-01-20
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2016-07-20
    相关资源
    最近更新 更多