SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.08<<123456789101112131415161718192021222324252627282930>>2017.10
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

プログラミングを生業としているくせに、これまでハッシュを使った検索をしたことがなかった(^^;

単純に全体をチェックしていた部分で、どうしても速度的に速めたかったため、ハッシュを使ってみた。
static int hash(char *s)
{
unsigned int h = 0;
for (;*s != '\0'; s++) h = h * 137 + *s;
return h % 1987;
}

static int PASCAL GetIndex(LPSTR lpszTag)
{
static int tbl_hash[2048];
int i, n, h;

if( *lpszTag=='\0' ) return 0;

h = hash(lpszTag);

while( (n = tbl_hash[h]) != 0 )
{
LPSTR p = (n&0x8000)==0 ? atag[n-1].name
: dtag[(n&0x7FFF)-1].name;
if( lstrcmpi(lpszTag, p) == 0 ) return n;
h++; h%=2048;
}

for(i=0;i<COUNT_ANALOG;i++)
if( lstrcmpi(lpszTag, atag[i].name) == 0 )
return (tbl_hash[h] = i+1);
for(i=0;i<COUNT_DIGITAL;i++)
if( lstrcmpi(lpszTag, dtag[i].name) == 0 )
return (tbl_hash[h] = (0x8000 | (i+1)));

debug("tag '%Fs' not found.", lpszTag);
return 0;
}


仕事で使ったものをほぼそのまま載せている。
ハッシュ関数 hash() ないで137を掛けたり、1987の余りを求めたりしている部分にも意味があるらしいのだが、そのあたりは割愛(^^) とりあえず、備忘録として載せておく。

テーマ:プログラミング - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。