我正在尝试哈希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;
}
有没有办法实现我的目标,也许是两者之间的演员?
答案 0 :(得分:11)
unsigned long x;
unsigned char * p = (unsigned char*)&x;
确保使用p
中的所有4个字节,或系统上unsigned long
的长度。
答案 1 :(得分:1)
从技术上讲,你可以通过以下方式实现它:
unsigned long value = 58281;
djb2((unsigned char *) &value, sizeof(value));
请注意常见的陷阱:
sizeof(object) > (int) sizeof(object)
的非常大的对象(如果适用于您的体系结构),请注意您可能会超出边界访问(未定义的行为)或仅是对象的一部分散列。答案 2 :(得分:1)
正如其他人所说,您可以轻松地将int
或任何其他对象作为char
数组读取:
unsigned char value = 0xde;
unsigned short value = 0xdead;
unsigned long value = 0xdeadbeef;
double value = 1./3;
djb2((unsigned char*)&value, sizeof value);
但请注意,存储在0xdead
或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;
}
答案 3 :(得分:0)
这显示了演员阵容。请注意,在这种情况下,“ABC”字符串将被终止,但这可能需要在现实世界中更加小心
#include <stdio.h>
int main() {
unsigned long x=0x414243; #0x414243 is ABC
unsigned char *s=(unsigned char *)&x;
printf("%s", s);
}
答案 4 :(得分:0)
由于您现在已经发布了代码,因此您需要使用与此类似的内容:
#include <stdio.h>
int main() {
unsigned long result, x = 0xdeadbeef;
x = convert_endian(x);
result = djb2((unsigned char*)&x, sizeof(x));
do_something(result);
return 0;
}
答案 5 :(得分:-2)
您应该使用ultoa_s
进行转换