如何散列一个三态二维数组

How to hash a tri-state two-dimensional array?

本文关键字:一个 二维数组 何散列      更新时间:2023-10-16

考虑以下代码。在unordered_map中使用Key中的数组的一个好的散列函数是什么?

#include <unordered_map>
using namespace std;
enum TriState {
    S0 = -1,
    S1 = 0,
    S2 = +1
};
struct K { // Key for the map
    TriState a[8][8];
    bool operator==(const K& k1) const {
        for (int i = 0; i < 64; i++)
            if (k1.a[0][i] != a[0][i])
                return false;
        return true;
    }
};
struct Hash {
    size_t operator()(const K& k) const {
        size_t s;
        // s = what is a good hash value?
        return s;
    }
};
unordered_map<K, int, Hash> m;

该算法应该是快速的,并提供近乎一致的散列:

size_t s = 0x3a7eb429; // Just some random seed value
for (int i = 0; i != 8; ++i)
{
    for (int j = 0; j != 8; ++j)
    {
        s = (s >> 1) | (s << (sizeof(size_t) * 8 - 1));
        s ^= k.a[i][j] * 0xee6b2807;
    }
}
s *= 0xee6b2807;
s ^= s >> 16;

之后,如果你想使哈希更强,哈希是另一次使用,例如MurmurHash3