1. 程式人生 > >linux kernel 的hash雜湊函式 : hash_long

linux kernel 的hash雜湊函式 : hash_long

教課數上的hash函式一般都是對模數取餘,模數一般就是hash表的長度(桶的個數),通常為了較好的雜湊性,還把模數調整為一個質數.

那麼核心中的hash函式是什麼樣呢?

以儲存pid的hash表的hash函式 hash_long為例, 隨便測試下其雜湊的隨機性.


測試程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

unsigned long hash_long(unsigned long val, unsigned int bits) 
{ 
    unsigned long hash = val * 0x9e370001UL; 
    return hash >> (32 - bits); 
}

int main()
{
    // 假設hash table的長度為8(2^3)
    int bits = 3;
    int elem_num = 1<<bits;
    int vec[elem_num];
                                                                                                                                    
    for (int i=0; i<elem_num; ++i)
        vec[i] = 0;

    srand(time(NULL));

    for(int i=0; i<1000; i++)
    {   
        int num = rand();
        //printf("num:%d\n", num);
        int elem_idx = hash_long(num, bits);
        vec[elem_idx] ++; 
    }   

    printf("========================\n");
    for (int i=0; i<elem_num; ++i)
    {   
        printf("vec[%d]: %d\n", i, vec[i]);
    }   

    return 0;
}

輸出結果:

看上去還不錯, 不同的桶中的元素個數差不多.

vec[0]: 116
vec[1]: 142
vec[2]: 112
vec[3]: 134
vec[4]: 129
vec[5]: 124
vec[6]: 118
vec[7]: 125