用于SAT预处理的哈希函数

时间:2012-01-05 11:00:45

标签: hash logic boolean-logic satisfiability

在预处理由子句数据库组成的SAT实例期间,需要为每个变量分配一个单词。散列函数为每个变量返回一个仅包含0的32位字,除了16个最高有效位(MSB)中的一个位和16个最低有效位(LSB)中的一个位,根据它们设置为1变量。子句的签名是其所有变量的散列函数值的按位OR。

如何实现此哈希函数?

1 个答案:

答案 0 :(得分:1)

嗯,每个半字有16种可能性; 1可以在16个地方。这给出了16x16 = 256个可能的“哈希”。对于可变计数&gt; 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}}