ハッシュ関数を、ちょっと、自分で作ってみた。

uint8 dkcHash8(uint8 *pd,size_t cycle){
uint32 v = 0;
size_t i;
for(i=0;i<cycle;i++){
v ^= (pd[i] << 3) + v;
}
return (uint8)((v % dkcdUNSIGNED_8BIT_PRIME_NUM) & 0xFF);
}

0から0xFFFFまでのデータをpdに入れてcycleに2を入れてヒストグラムをとってみると、ほぼすべてが256に落ち着いた。
それ以外は以下のような値だった。
見方:ハッシュ値 / カウント数

hash_value = 0 / count = 512
hash_value = 8 / count = 384
hash_value = 16 / count = 384
hash_value = 24 / count = 384
hash_value = 32 / count = 384
hash_value = 48 / count = 383
hash_value = 56 / count = 384
hash_value = 64 / count = 384
hash_value = 72 / count = 384

だった。
果たしてこれは優秀か?
それを調べるためにはやっぱり数学か・・・。
ガンバラナケレバ・・・。

追記:なんか、以下の方が結う主な気もする・・・(はやく評価方法とかわかるようにならなければ・・・)
0,8,16,24,32,40,48,56,64,72,80,88,251,252,253,254,255,の時に偏ったが100以上の偏りは無い。

uint8 dkcHash(uint8 *pd,size_t cycle){
uint32 v = 0;
size_t i;
for(i=0;i<cycle;i++){
v = (pd[i] << 3) + v;
}
return (uint8)((v % dkcdUNSIGNED_8BIT_PRIME_NUM) & 0xFF);
}

8,16,24,32でデータが大幅に偏るがそれ以外は均一

uint8 dkcHash(uint8 *pd,size_t cycle){
uint32 v = 0;
size_t i;
for(i=0;i<cycle;i++){
v ^= (pd[i] << 3);
}
return (uint8)((v % dkcdUNSIGNED_8BIT_PRIME_NUM) & 0xFF);
}