如何散列一个三态二维数组
How to hash a tri-state two-dimensional array?
考虑以下代码。在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
相关文章:
- 使用 Win32 中的 HBITMAP 绘制一个二维数组,C++
- 在C++中将一个二维数组复制到其他未知大小的二维数组
- 是一个二维数组的名称,它在C++中的第一个元素的地址
- C++2d地图?就像一个二维数组
- 当您有一个二维数组(C++)时调用析构函数的正确方法是什么?
- 从函数返回一个二维数组
- 当我尝试输出一个二维数组时,它输出了错误的数字
- 为什么我可以声明一个二维数组与两个维度大小的变量,但不是新的
- c++函数创建一个二维数组并返回一个指向该二维数组的指针
- 如何返回一个二维数组,其中一个维度是未知的大小
- 我如何在函数中返回一个二维数组
- 创建一个二维数组,其中一个维度在编译时未知
- 如何在c++中发送一个二维数组作为引用,并返回
- 从c++函数返回一个二维数组
- 最好的c++库显示图像从一个二维数组
- 我可以把一个二维数组当作一个连续的一维数组吗?
- 尝试填充一个二维数组,但它仍然是一个一维数组
- 用构造函数和用户输入创建一个二维数组
- 需要传递一个二维数组,但必须动态调整大小
- 在给定一个元素的地址下搜索一个二维数组