2015-06-13 36 views
3

我試圖在C中編寫哈希集,並且我找到了一個哈希函數,它根據數據中的位進行散列。我有以下結構:C - 對代表結構的位進行操作

struct triple 
{ 
    int a; 
    int b; 
    int c; 
}; 

的問題是 - 如何從struct triple類型的對象獲取位表示?假設我想用8位整數異或它的位。我會怎麼做?

+0

雖然看起來可能需要一個通用的哈希算法,可以用於幾乎所有的東西(在這種情況下,你稱之爲「三重」),但是有一些錯誤這個想法。考慮一些實現可能採用奇偶校驗形式的*填充位*的思想。如果一個值字節後面跟着一個奇偶校驗字節,只需翻轉所有的位,那麼這個散列算法會起什麼作用呢?澄清:在這種情況下,所有值將產生相同的散列,其中只包含1位。 – Sebivor

+1

@undefinedbehaviour我從來沒有見過C編譯器產生代碼來維護校驗和。但幾乎每個人都使用pad _bytes_來進行內存對齊。這些字節沒有確定性的值,所以 - 正如你所說 - 包含它們的散列是完全不可靠的。 – Gene

+0

@Gene Ahh,更好的例子! – Sebivor

回答

5

遍歷struct和XOR的所有字節每一個單獨,如

void bytexor(unsigned char xor_byte, void *data, size_t size) { 
    unsigned char *p = data; 
    while (size--) { 
     *p++ ^= xor_byte; 
    } 
} 

用法是:

struct triple my_struct; 
// ... 
bytexor(0xFF, &my_struct, sizeof my_struct); 

(注:這回答瞭如何進行XOR的問題struct帶有一個字節對於實現一個基於此的通用散列函數,可能不是一個特別好的想法,因爲struct可能有填充,即帶有潛在非確定性值的額外字節與值無關)