2012-12-11 79 views
3

我正在使用哈希表實現UThash。調用函數會使UThash失敗

我使用插入元素的原始:

HASH_ADD(hh,hash_table,key,keylen,elem); 

和檢索與基本元素:

HASH_FIND(hh,hash_table,key,keylen,elem); 

出於某種原因,我不知道,哈希查找的行爲被修改當我調用一個函數。也就是說,uthash未找到存在於表中的元素。

我懷疑內存已經在某種程度上被破壞。

觸發此故障不需要執行任何代碼使UThash功能失效:

//Note: ct = custom_type 
    int func1(ct1 *ptr1, ct2 *ptr2, ct3 *ptr3,char **buffer,size_t *size) 
    { 
     HASH_FIND(...) //does not work 

     /** 
     * code 
     */ 
     return 0; 
    } 

    int func2(ct1 *ptr1,ct2 *ptr2,ct3 *ptr3) 
    { 
     char *buffer; 
     size_t buf_size; 

     /** 
     * code 
     */ 

     HASH_FIND(...) // works! 
     if(func1(ptr1,ptr2,ptr3,&buffer,&buf_size)){ 
      //code 
     }/*error*/ 

     return 0; 
    } 

    int func3(ct1 *ptr1,ct2 *ptr2,ct3 *ptr3) 
    { 
     char *buffer; 
     size_t buf_size; 

     HASH_FIND(...) // works! 
     if(func1(ptr1,ptr2,ptr3,&buffer,&buf_size)){ 
      //code 
     }/*error*/ 

     /** 
     * code 
     */ 

     return 0; 
    } 

所以在這兩個FUNC2()FUNC3()相同的行爲發生。在我致電func1()後,hash_find()開始失敗。

所有其餘的代碼是完美和正確地執行。

我明顯的問題是什麼可能導致這種類型的失敗?

感謝您的閱讀並隨意問任何其他信息。

回答

2

這可能是由於使用相同的密鑰將多個項目添加到散列引起的。如果你使用uthash,你需要確保你的結構中沒有重複的鍵,或者提供一個包裝函數來代替舊的項目。否則,結構的行爲是不可預知的,可能會導致您描述的失敗。

uthash user guide

如果有重複的鍵可以通過您的 程序產生的任何機會,你必須明確地添加 關鍵哈希前檢查的唯一性。如果密鑰已經在哈希中,您可以簡單地使用 修改哈希中的現有結構,而不是添加項目。 將具有相同密鑰的兩個項目添加到散列表中是錯誤的。

+0

相當古老的問題,但似乎我遇到了完全相同的問題。我知道沒有多個項目具有相同的鍵(在構建哈希表時進行檢查和驗證),但在另一個函數內調用「HASH_FIND」函數失敗。爲了弄清楚爲什麼,我一直在摸索着我的頭腦。我甚至可以通過迭代整個表來找到密鑰,但FIND卻無法做到這一點!任何線索可能是什麼原因? –

0

我有類似的問題,當我用鑰匙INT HASH_FIND_INT更換之後有型無符號字符, 開始正常工作。進一步的調查引起表明打擾符號字符無符號的字符是不恰當的,而短整型無符號短整型似乎很好地工作爲好。

哈希函數計算算法正常運行可能8位不夠。 請注意,unsigned char操作的原始代碼是間歇性的,代碼在某些版本中工作,在其他版本中無效(與uthash無關的更改)。

結論:類型的使用鍵HASH_FIND_INT的正確操作符號int,或使用短整型無符號短風險自擔。

0

也許,它不是這樣的,但是當我使用了一些struct作爲HASH_FIND關鍵我也遇到過類似的問題。當您使用sizeof()確定密鑰長度時,請注意struct填充。如果您沒有正確初始化密鑰,則此填充可能是查找時找不到uthash的原因。

+0

@MLavoie:這看起來似乎試圖回答OP的問題。它沒有要求從OP得到澄清。我認爲它不應該被刪除。 – gariepy