在预处理由子句数据库组成的SAT实例期间,需要为每个变量分配一个单词。散列函数为每个变量返回一个仅包含0的32位字,除了16个最高有效位(MSB)中的一个位和16个最低有效位(LSB)中的一个位,根据它们设置为1变量。子句的签名是其所有变量的散列函数值的按位OR。
如何实现此哈希函数?
答案 0 :(得分:1)
嗯,每个半字有16种可能性; 1可以在16个地方。这给出了16x16 = 256个可能的“哈希”。对于可变计数> 256,你一定会发生碰撞。您可以做的是在将v % 256
传递给哈希函数之前传递unsigned int hash_variable(int v)
{
v = v % 256
assert(v < 256);
unsigned char lower_nibble = v & 0x0f;
unsigned char upper_nibble = (v & 0xf0) >> 4;
assert(lower_nibble < 16);
assert(upper_nibble < 16);
unsigned int result = 0;
result |= (1 << upper_nibble);
result |= (1 << (lower_nibble + 16));
return result;
}
。这是一种可能的哈希函数:
{{1}}