我正试图在C中实现DJB算法,以构建一个类似字典的结构。
如果传递的键是一个char指针,那么我的实现效果很好。但是,如果我传递一个整数,它就会崩溃,我不确定为什么以及如何实现这一点。基本上,我需要散列一个字符串和一个整数。
static unsigned int DJBHash(void* key, unsigned int len) {
unsigned int hash = 5381;
unsigned int i = 0;
char* ptr = (char *)key;
for (i = 0; i < len; i++)
{
hash += hash << 5;
hash += *ptr; /* crashes if key is not originally a char* */
ptr++;
}
return hash;
}
这个get被简单地调用以获得一个散列值:DJBHash((void*)420, sizeof(420));
崩溃,而DJB((void*)"foo", sizeof("foo"));
工作得非常好。
DJBHash(420, sizeof(420));
崩溃,而DJB("foo", sizeof("foo"));
运行良好。
这是因为在程序中使用420
不是有效的内存地址。因此,当您的函数试图使用该内存地址时,它会崩溃。通常情况下,您甚至不会尝试以这种方式强制使用特定的内存地址。它只在非常特定的情况下工作,比如当它是内核空间中的已知地址或类似的情况时。
如果你想散列一个整数而不是特定的内存位置,它应该是:
int j = 420;
DJBHash(&j, sizeof(j));