2016-08-19 100 views
1

我對我應該爲MurmurHash3_x86_128()提供的參數感到困惑。 murmurhash3代碼可以找到https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp。方法定義如下。C++我們應該在MurmurHash3參數中傳遞什麼?

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; 
} 
+0

至少你應該爲'hash_otpt'分配內存。目前,您正在將無效指針傳遞給函數 – mvidelgauz

回答

1

該函數將其哈希放在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; 
1
hash_otpt

是一個指針,什麼都沒有,但功能預計第四個參數是一個指針一些存儲器因爲它其輸出寫入該存儲器。在你的例子中,它嘗試寫入操作,但失敗(由於指針未初始化,無法寫入)。這給你一個SegmentationFault。

圖列於多少uint64_t小號確實散列配合到(2,因爲輸出的大小是128位,和一個uint64_t的大小是64位)和分配的內存:

hash_otpt = new uint64_t [2]; 
+0

或更好'const size_t needed_size = 2; uint64_t hash_otpt [needed_size];'(通過檢查源碼找到常量2)。 –

+0

我們還需要說明'len'應該是什麼。它是否告訴'key'的長度(它被聲明爲'void',而不是'char',所以它看起來不像函數想要C string)或'out'?不可能告訴沒有具體的lib知識 – mvidelgauz

0

如果你看the documentation,你可以看到

MurmurHash3_x64_128 ...它有一個128位的輸出。

所以,你的代碼可以是這樣的

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

注意,您不必動態分配輸出的。

相關問題