Tole sem zgruntal
[c]
unsigned long Hash(void *buf, size_t length, unsigned long hashValue)
{
unsigned char *bStart = (unsigned char *)buf;
unsigned char *bEnd = bStart + length;
while (bStart < bEnd)
{
hashValue ^= (long)*bStart++;
hashValue += hashValue << 13;
hashValue ^= hashValue << 3;
hashValue += hashValue >> 5;
hashValue ^= hashValue < < 11;
hashValue += hashValue >> 17;
hashValue ^= hashValue << 17;
}
return hashValue;
}
[/c]
Lahko kdo pohitri tole? Trenutne lastnosti, za vsak spremenjeni bit v podanem nizu se spremenijo vsi biti hasha. Precej dobra razporeditev hashev po celotnem hash prostoru. Torej, niz 000001, ne bo samo za eno vrednost oddaljen od niza 000002. Hash je inkrementalen (aditiven?) in mu lahko podamo začetno vrednost. Se pravi, hash za "SlovenskiPionir" je isti, kot hash za "Pionir", če mu kot začetno vrednost podamo hash za "Slovenski".
Vse kar rabim je hitrost. Ukvarjal sem se z idejo, da bi za prve znake lahko kar vnaprej zračunal hash vrednosti in jih spravil v neko tabelo, potem bi vse skupaj uporabil nekako takole:
[c]
unsigned long hashes[255] = {hash1, hash2, hash3, hash4 .... hash255};
unsigned char *bStart = (unsigned char *)buf;
unsigned char *bEnd = bStart + length;
if (hashValue == 0)
{
hashValue = hashes[(unsigned char)buf[0]];
*bStart++;
}
while (bStart < bEnd)
{
hashValue ^= (long)*bStart++;
...
[/c]
Ampak pri stringu dolgem 50 znakov na primer, bi bila pohitritev minimalna. Če bi vse skupaj sploh bilo kaj hitreje.
4 thoughts on “Tole sem zgruntal”
A ti tole dejansko prinese bistveno boljse rezultate, kot npr.
unsigned long Hash(void *buf, size_t length, unsigned long hashValue){
unsigned long *i = (unsigned long*)buf;
unsigned long *end = (unsigned long*)(((char*)buf)+length);
while(i
mene predvsem zanima, kakšna je verjetnost trka. brez tega podatka ni razprševalna funkcija vredna pol pičke hladne vode…
Jaka, precej, precej prevec jih je. 🙂
V bistvu jih ni. Po nekaj testih se je izkazalo, da za potrebe, ki jih imamo, 1.2% kolizij v 10mio random stringih ne predstavlja nekega problema.
Comments are closed.