你能提供一个散列函数
是,所有位都被交换:
基本上它将帮助我改进我的 MAX-CUT 算法
你能提供一个散列函数
是,所有位都被交换:
基本上它将帮助我改进我的 MAX-CUT 算法
如果是一个非对称散列,您总是可以通过定义使其对称,其中可以是任何对称运算(例如,按位异或)。
以下哈希函数是对称的。请注意,位移是任意的,实际上您不必这样做。关键是您要确保用于创建散列的术语是对称的(在本例中为加法和乘法),并且您使用密钥及其位翻转版本来计算散列索引。
在 C/C++ 中:
// symmetric hash function
unsigned char sym_hashfunc( unsigned char key ){
unsigned int flip = ~key;
unsigned int left = (key + flip);
unsigned int right = (key * flip);
return (left>>3) ^ (right>>1);
}
int main(int argc, const char * argv[]) {
// some random input key
unsigned int key = 12;
unsigned int flipkey = ~key; // find bit flipped version
// print results. Should show same hash value
printf("Hash1 = %u, Hash2 = %u\n",sym_hashfunc(key),
sym_hashfunc(flipkey));
// exit
return 0;
}
我不知道已建立的对称散列函数,但很容易将此属性添加到现有函数hash中。
我们my_hash任意决定所有具有正第一位的数据是并且具有负第一位的数据是。如果输入是我们返回否则。请参阅下面的伪代码。datahash(i)bit_inverse(hash(i))
def my_hash(data)
# arbitrary way to identify if data is already inverted
if first bit of data is set
return hash(data)
else
return bit_inverse(hash(data))
在使用它之前,请确保对冲突和哈希值分布的负面影响与您的问题无关。