C 16位的旋转散列

C 16位的旋转散列,c,hash,C,Hash,给出如下旋转散列的描述 unsigned rot_hash ( void *key, int len ) { unsigned char *p = key; unsigned h = 0; int i; for ( i = 0; i < len; i++ ) h = ( h << 4 ) ^ ( h >> 28 ) ^ p[i]; return h; } 很难用散列来谈论“正确”,因为任何确定性结果都可以

给出如下旋转散列的描述

unsigned rot_hash ( void *key, int len )
{
    unsigned char *p = key;
    unsigned h = 0;
    int i;

    for ( i = 0; i < len; i++ )
        h = ( h << 4 ) ^ ( h >> 28 ) ^ p[i];

   return h;
} 
很难用散列来谈论“正确”,因为任何确定性结果都可以被认为是正确的。也许散列分布不会那么好,但是这个散列看起来并不是最强的

根据您建议的更改,您将得到的数字仍然是32位数字,高16位不会是零

最简单的方法是不做任何更改,并将结果强制转换为无符号short

很难用散列来谈论“正确”,因为任何确定性结果都可以被认为是正确的。也许散列分布不会那么好,但是这个散列看起来并不是最强的

根据您建议的更改,您将得到的数字仍然是32位数字,高16位不会是零


最简单的方法是不做任何更改,将结果强制转换为unsigned short

可能最好保留大散列,只在返回时截断,如:

for ( i = 0; i < len; i++ )
    h = ( h << 4 ) ^ ( h >> 28 ) ^ p[i];

return h & 0xffff;
(i=0;i h=(h>28)^p[i]; 返回h&0xffff; 移位常数4和28可能不是最好的(简而言之:因为它们有一个公约数)

经过一些实验,我得到了以下hashfunction,它的目标是在较低的位中获得最大的熵(这样可以使用两个表大小的幂)(这是在中使用的一个):

unsigned hash\u mem(void*dat,size\t len)
{
无符号字符*str=(无符号字符*)dat;
无符号val=0;
尺寸(idx);;
对于(idx=0;idxval^=(val>>2)^(val可能最好保留大哈希,只在返回时截断,如:

for ( i = 0; i < len; i++ )
    h = ( h << 4 ) ^ ( h >> 28 ) ^ p[i];

return h & 0xffff;
(i=0;i h=(h>28)^p[i]; 返回h&0xffff;
移位常数4和28可能不是最好的(简而言之:因为它们有一个公约数)

经过一些实验,我得到了以下hashfunction,它的目标是在较低的位中获得最大的熵(这样可以使用两个表大小的幂)(这是在中使用的一个):

unsigned hash\u mem(void*dat,size\t len)
{
无符号字符*str=(无符号字符*)dat;
无符号val=0;
尺寸(idx);;
对于(idx=0;idxval^=(val>>2)^(Vald考虑我把H声明为16位整数。在开始时你没有写。无论如何,最好是尽可能晚地截断数据。考虑我把H声明为16位整数。在开始时你没有写它。总之,最好晚些时候截断数据。我们应该怎么写一个索引的旋转哈希方法?数组中位数的相关性?我们应该如何编写与数组中位数无关的旋转哈希方法?
unsigned hash_mem(void *dat, size_t len)
{
unsigned char *str = (unsigned char*) dat;
unsigned val=0;
size_t idx;

for(idx=0; idx < len; idx++ )   {
        val ^= (val >> 2) ^ (val << 5) ^ (val << 13) ^ str[idx] ^ 0x80001801;
        }
return val;
}