2

我正在尝试散列一个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;
}

有没有办法可以实现我的目标,也许是两者之间的演员?

4

6 回答 6

13
unsigned long x;

unsigned char * p = (unsigned char*)&x;

确保您使用所有 4 个字节,或者您系统上的p任何长度。unsigned long

于 2013-05-14T07:12:26.383 回答
1

从技术上讲,您可以通过以下方式实现它:

unsigned long value = 58281;
djb2((unsigned char *) &value, sizeof(value));

但是,请注意通常的陷阱:

  • 有问题的散列函数最初用于字符串(因此是原型),因此请确保它符合您的需求(碰撞次数、雪崩等)
  • 如果在某些时候您想要散列非常大的对象sizeof(object) > (int) sizeof(object)(如果适用于您的体系结构),请注意您可能会越界访问(未定义的行为)或仅散列对象的一部分。
于 2013-05-14T07:56:35.527 回答
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存储在 ashort或 along 中的 hash 不会相同

另请注意,使用Duff 的设备可以更好地展开您的哈希函数:

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;
}
于 2013-05-14T09:17:42.877 回答
0

这显示了演员的工作。请注意,在这种情况下,“ABC”字符串将以空值结尾,但这在现实世界中可能需要更加小心

#include <stdio.h>

int main() {
    unsigned long x=0x414243;  #0x414243 is ABC
    unsigned char *s=(unsigned char *)&x;
    printf("%s", s);
}
于 2013-05-14T07:23:40.050 回答
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;
}
于 2013-05-14T07:33:00.347 回答
-2

您应该使用ultoa_s转换它

于 2013-05-14T07:13:41.547 回答