Я запутался с тем, какой параметр я должен предоставить для 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;
}
Эта функция помещает свой хэш в 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;
hash_otpt
указатель на ничто, но функция ожидает, что четвертый аргумент будет указателем в память как он записывает свой вывод в эту память. В вашем примере он пытается выполнить операцию записи, но не может (некуда писать так как указатель не инициализирован). Это дает вам SegmentationFault.
Выяснить, во сколько uint64_t
s подходит ли хэш (2, потому что размер выходного файла равен 128 битам, а размер uint64_t
составляет 64 бита) и выделить память:
hash_otpt = new uint64_t [2];
Если вы посмотрите на документация, ты можешь видеть
MurmurHash3_x64_128 … Имеет 128-битный выход.
Итак, ваш код может быть примерно таким
uint64_thash_otpt[2]; // This is 128 bits
MurmurHash3_x64_128(key, (uint64_t)strlen(key), seed, hash_otpt);
Обратите внимание, что вам вообще не нужно динамически распределять вывод.