Murmur Hash - значения Hash не соответствуют

0

Я реализовал MurmurHash в C++, и он хэширует фантастически, за исключением того, что если вы вызываете его дважды подряд с той же строкой... он не имеет хэша с тем же номером.
Почему это не хеширование с тем же номером все время???

int 
Hash::hf (string ins) {
  return MurmurHash2(&ins,ins.size(),11); 
}
unsigned int Hash::MurmurHash2 (const void *key, int len, unsigned int seed )
{
// 'm' and 'r' are mixing constants generated offline.
// They're not really 'magic', they just happen to work well.
const unsigned int m = 0x5bd1e995;
const int r = 24;

// Initialize the hash to a 'random' value

unsigned int h = seed ^ len;

// Mix 4 bytes at a time into the hash

const unsigned char * data = (const unsigned char *)key;

while(len >= 4)
{
    unsigned int k = *(unsigned int *)data;

    k *= m; 
    k ^= k >> r; 
    k *= m; 

    h *= m; 
    h ^= k;

    data += 4;
    len -= 4;
}

// Handle the last few bytes of the input array

switch(len)
{
case 3: h ^= data[2] << 16;
case 2: h ^= data[1] << 8;
case 1: h ^= data[0];
        h *= m;
};

// Do a few final mixes of the hash to ensure the last few
// bytes are well-incorporated.

h ^= h >> 13;
h *= m;
h ^= h >> 15;

return h % HASH_TABLE_SIZE;
 }
  • 0
    Можете ли вы опубликовать свой код, который дважды хеширует одну и ту же строку и печатает разные числа?
  • 0
    Потому что вы передаете адрес в string с неявным преобразованием в void* - вместо этого передайте string::data() .
Показать ещё 5 комментариев
Теги:
hash

1 ответ

0
Лучший ответ

Этот код неверен:

return MurmurHash2(&ins,ins.size(),11); 

Правильный код:

return MurmurHash2(ins.c_str(),ins.size(),11);

Но, я хочу сказать, этот ропот кажется относительной слабой функцией и может приводить к столкновениям с гораздо большей вероятностью, чем случайным. Вы видите: если на любой итерации блок младших бит "h" становится равным нулю, то эти биты не будут изменены после

h *= m;

Кроме того, из-за использования XOR в следующей операции удвоенные значения будут XOR-out из хэша. Таким образом, даже число повторений 4-байтовой подстроки, например, "abcdabcd", не изменило бы и младших бит хэша.

  • 0
    Вы не всегда хотите случайный хэш. Murmur полезен для таких приложений, как фильтры Блума, где вам нужна относительно быстрая функция, которая дает вам тот же хэш, когда вы передаете ему то же значение. Он не предназначен для криптографического хэша и не должен использоваться как один.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню