对称散列函数

计算科学 优化
2021-12-28 12:32:03

你能提供一个散列函数F(x)|F(x)=F(x¯),x{0;1}n

x¯,所有位都被交换:x01,10

基本上它将帮助我改进我的 MAX-CUT 算法

3个回答

如果是一个非对称散列,您总是可以通过定义使其对称,其中可以是任何对称运算(例如,按位异或)。F(x)F(x)=F(x)+F(x~)+

以下哈希函数是对称的。请注意,位移是任意的,实际上您不必这样做。关键是您要确保用于创建散列的术语是对称的(在本例中为加法和乘法),并且您使用密钥及其位翻转版本来计算散列索引。

在 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任意决定所有具有正第一位的数据是并且具有负第一位的数据是如果输入我们返回否则请参阅下面的伪代码。xx¯dataxhash(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))

在使用它之前,请确保对冲突和哈希值分布的负面影响与您的问题无关。