首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将long unsigned转换为unsigned char*?

如何将long unsigned转换为unsigned char*?
EN

Stack Overflow用户
提问于 2013-05-14 15:06:55
回答 6查看 34.4K关注 0票数 2

我正在尝试散列一个unsigned long值,但是散列函数需要一个unsigned char *,如下面的实现所示:

代码语言:javascript
复制
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;
}

有没有一种方法可以实现我的目标,也许是通过在两者之间进行转换?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-14 15:12:26

代码语言:javascript
复制
unsigned long x;

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

确保通过p或系统上的unsigned long长度使用所有4个字节。

票数 13
EN

Stack Overflow用户

发布于 2013-05-14 15:56:36

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

代码语言:javascript
复制
unsigned long value = 58281;
djb2((unsigned char *) &value, sizeof(value));

然而,要注意常见的陷阱:

  • 所讨论的散列函数最初用于字符串(因此是原型),因此请确保它符合您的需要(冲突数量、雪崩等)。
  • 如果您想散列sizeof(object) > (int) sizeof(object) (如果适用于您的体系结构)的非常大的对象,请注意,您可能会越界访问(未定义的行为)或仅对对象的一部分进行散列。
票数 1
EN

Stack Overflow用户

发布于 2013-05-14 17:17:43

正如其他人所说,您可以轻松地将int或任何其他对象作为char数组读取:

代码语言:javascript
复制
unsigned char value = 0xde;
unsigned short value = 0xdead;
unsigned long value = 0xdeadbeef;
double value = 1./3;

djb2((unsigned char*)&value, sizeof value);

但请注意,存储在shortlong 中的不会有相同的散列。

还请注意,使用Duff's device可以更好地展开散列函数:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16537069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档