hash — C ++ Что мы должны передать в параметрах MurmurHash3?

Я запутался с тем, какой параметр я должен предоставить для MurmurHash3_x86_128 (). Код murmurhash3 можно найти https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp. Определение метода приведено ниже.

void MurmurHash3_x86_128 ( const void * key, const int len,
uint32_t seed, void * out )

Я передал следующие значения в вышеупомянутом методе, но мой компилятор дает мне ошибку сегментации. Что я делаю неправильно ?

int main()
{
uint64_t seed = 1;
uint64_t *hash_otpt;
const char *key = "hi";
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
cout << "hashed" << hash_otpt << endl;
return 0;
}

2

Решение

Эта функция помещает свой хэш в 128 бит памяти.

То, что вы делаете, передает указатель, который еще не выделен для него.

Правильное использование будет примерно таким:

int main()
{
uint64_t seed = 1;
uint64_t hash_otpt[2];  // allocate 128 bits
const char *key = "hi";
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
cout << "hashed" << hash_otpt[0] << hash_otpt[1] << endl;
return 0;
}

Вы могли заметить это, проанализировав, как MurmurHash3_x86_128 заливка out параметр:

((uint64_t*)out)[0] = h1;
((uint64_t*)out)[1] = h2;
2

Другие решения

hash_otpt указатель на ничто, но функция ожидает, что четвертый аргумент будет указателем в память как он записывает свой вывод в эту память. В вашем примере он пытается выполнить операцию записи, но не может (некуда писать так как указатель не инициализирован). Это дает вам SegmentationFault.

Выяснить, во сколько uint64_ts подходит ли хэш (2, потому что размер выходного файла равен 128 битам, а размер uint64_t составляет 64 бита) и выделить память:

hash_otpt = new uint64_t [2];
1

Если вы посмотрите на документация, ты можешь видеть

MurmurHash3_x64_128 … Имеет 128-битный выход.

Итак, ваш код может быть примерно таким

    uint64_thash_otpt[2]; // This is 128 bits
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);

Обратите внимание, что вам вообще не нужно динамически распределять вывод.

0
По вопросам рекламы [email protected]