我正在尝试散列一个unsigned long值,但是散列函数需要一个unsigned char *,如下面的实现所示:
unsigned long djb2(unsigned char *key, int n)
{
unsigned long hash = 5381;
int i = 0;
while (i < n-8) {
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
}
while (i < n)
hash = hash * 33 + key[i++];
return hash;
}有没有一种方法可以实现我的目标,也许是通过在两者之间进行转换?
发布于 2013-05-14 15:12:26
unsigned long x;
unsigned char * p = (unsigned char*)&x;确保通过p或系统上的unsigned long长度使用所有4个字节。
发布于 2013-05-14 15:56:36
从技术上讲,您可以通过以下方式实现:
unsigned long value = 58281;
djb2((unsigned char *) &value, sizeof(value));然而,要注意常见的陷阱:
sizeof(object) > (int) sizeof(object) (如果适用于您的体系结构)的非常大的对象,请注意,您可能会越界访问(未定义的行为)或仅对对象的一部分进行散列。发布于 2013-05-14 17:17:43
正如其他人所说,您可以轻松地将int或任何其他对象作为char数组读取:
unsigned char value = 0xde;
unsigned short value = 0xdead;
unsigned long value = 0xdeadbeef;
double value = 1./3;
djb2((unsigned char*)&value, sizeof value);但请注意,存储在short或long 中的不会有相同的散列。
还请注意,使用Duff's device可以更好地展开散列函数:
unsigned long djb2(unsigned char *k, int size)
{
unsigned long h = 5381;
int i = 0;
switch(size % 8) {
case 0: while(i < size) {
h = h*33 + k[i++];
case 7: h = h*33 + k[i++];
case 6: h = h*33 + k[i++];
case 5: h = h*33 + k[i++];
case 4: h = h*33 + k[i++];
case 3: h = h*33 + k[i++];
case 2: h = h*33 + k[i++];
case 1: h = h*33 + k[i++];
}
}
return h;
}https://stackoverflow.com/questions/16537069
复制相似问题