デースケドガーハッシュアルゴリズム

studiokingyo2005-02-08

なんか、http://d.hatena.ne.jp/studiokingyo/20050205#p2
ハッシュ関数作りが楽しくなっちゃったんだけど、SHA1の初期価値を使って見たら結構イイ感じの結果だったので載せておく
でも、両者共にバグチェックしていないです。
さまざまな条件下でテストして無いです。
ライセンスはNYSLです。
3バイトくらいの値からハッシュ値を算出するのがイイみたいです。
CSVデータ出力機を自己満足に置いておきます。
http://www33.tok2.com/home/dca/dkutil.html
もし、名前を付けるとしたらデースケドガーハッシュアルゴリズム*1
でも、後になってこれが既知のアルゴリズムだったら(/ω\)ハズカシーィ
追記:既知と言うか、ハッシュ関数の理解不足からくる自爆だったのですが・・・_| ̄|○ なんか、もっと(/ω\)ハズカシーィ のですが・・・ 
_| ̄|○ { 以下はネタです。気にしないで下さい m(_ _)m


int dkcHash16(unsigned char *pd,size_t cycle){
unsigned int v = 0;
size_t i;

//SHA1で使われている初期価値
const static unsigned long H[3]={0x67452301,0xefcdab89,0x98badcfe};

for(i=0;i<cycle;i++){
v = (v << 6) + pd[i] ^ H[i & 2];
}
return (int)((v % 31991) & 0x7FFF);
}


変形版


int dkcHash16_(unsigned char *pd,size_t cycle){
unsigned int v = 0;
size_t i;
size_t shift_ = 16 / cycle;
if(shift_ == 0)
shift_ = 1;
//SHA1で使われている初期価値
const static DWORD H[3]={0x67452301,0xefcdab89,0x98badcfe};

for(i=0;i<cycle;i++){
v = (v << shift_) + pd[i] ^ H[i & 2];
}
return (int)((v % 31991) & 0x7FFF);
}

追記:後で、思ったが、結局割って余りを出すならば普通に割るだけなら均一になるのは当たり前だと思った。(/ω\)ハズカシーィ

int dkcHash16_(unsigned char *pd,size_t cycle){
unsigned int v = 0;
size_t i;
BYTE cc =

v = pd[0] | (pd[1] << 8) | (pd[2]<< 16) | (pd[3] << 24);

return (int)((v % 31991) & 0x7FFF);
}

更に追記:ほんのちょっこっとだけ改良・・・
後々、しっかりと基礎を勉強しなければ・・・


int dkcHash16_(unsigned char *pd,size_t cycle){
unsigned int v = 0;
size_t i;
size_t shift_ = 16 / cycle;
if(shift_ == 0)
shift_ = 1;
//SHA1で使われている初期価値
const static DWORD H[3]={0x67452301,0xefcdab89,0x98badcfe};

for(i=0;i<cycle;i++){
v = (pd[i] << shift_) + v ^ H[i & 2];
}
return (int)((v % 31991) & 0x7FFF);
}

でも、結局、実用性に耐えない・・・
_| ̄|○ { 意味も無くGoogleのヒット率上げる為にデースケドガーを連発しますorz }

*1:SHAをパックっておいてそりゃないだろ (--;) ヽ(--;)