プログラミングを生業としているくせに、これまでハッシュを使った検索をしたことがなかった(^^;
単純に全体をチェックしていた部分で、どうしても速度的に速めたかったため、ハッシュを使ってみた。
単純に全体をチェックしていた部分で、どうしても速度的に速めたかったため、ハッシュを使ってみた。
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の余りを求めたりしている部分にも意味があるらしいのだが、そのあたりは割愛(^^) とりあえず、備忘録として載せておく。
テーマ:プログラミング - ジャンル:コンピュータ
|
| ホーム |
SHOJI's Code



