3
我试图在C中编写哈希集,并且我找到了一个哈希函数,它根据数据中的位进行散列。我有以下结构:C - 对代表结构的位进行操作
struct triple
{
int a;
int b;
int c;
};
的问题是 - 如何从struct triple
类型的对象获取位表示?假设我想用8位整数异或它的位。我会怎么做?
我试图在C中编写哈希集,并且我找到了一个哈希函数,它根据数据中的位进行散列。我有以下结构:C - 对代表结构的位进行操作
struct triple
{
int a;
int b;
int c;
};
的问题是 - 如何从struct triple
类型的对象获取位表示?假设我想用8位整数异或它的位。我会怎么做?
遍历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
可能有填充,即带有潜在非确定性值的额外字节与值无关)
虽然看起来可能需要一个通用的哈希算法,可以用于几乎所有的东西(在这种情况下,你称之为“三重”),但是有一些错误这个想法。考虑一些实现可能采用奇偶校验形式的*填充位*的思想。如果一个值字节后面跟着一个奇偶校验字节,只需翻转所有的位,那么这个散列算法会起什么作用呢?澄清:在这种情况下,所有值将产生相同的散列,其中只包含1位。 – Sebivor
@undefinedbehaviour我从来没有见过C编译器产生代码来维护校验和。但几乎每个人都使用pad _bytes_来进行内存对齐。这些字节没有确定性的值,所以 - 正如你所说 - 包含它们的散列是完全不可靠的。 – Gene
@Gene Ahh,更好的例子! – Sebivor