linux kernel 的hash雜湊函式 : hash_long
阿新 • • 發佈:2019-02-20
教課數上的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