2015-06-13 33 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可能有填充,即带有潜在非确定性值的额外字节与值无关)