Jenkins hash függvények | |
---|---|
Először megjelent | 1997 |
Típusú | hash függvény |
A Jenkins hash függvények Bob Jenkins által kifejlesztett általános célú hash függvények változó hosszúságú kulcsokhoz. A függvények ellenőrző összegként is használhatók a véletlen adatsérülések vagy az adatbázisban lévő azonos rekordok észlelésére . A funkció leírása először 1997-ben jelent meg.
A fenti függvényszöveg Bob Jenkins weboldaláról származik, és egy bővített változata, amelyet a szerző a Dr. Dobbs' Journal-ban tett közzé.
uint32_t jenkins_one_at_a_time_hash ( unsigned char * kulcs , size_t len ) { uint32_t hash , i ; for ( hash = i = 0 ; i < len ; ++ i ) { hash += kulcs [ i ]; hash += ( hash << 10 ); hash ^= ( hash >> 6 ); } hash += ( hash << 3 ); hash ^= ( hash >> 11 ); hash += ( hash << 15 ); return hash ; }A jobb oldali ábra a függvény lavina hatását mutatja .
A 24 sor mindegyike egy bitnek felel meg a bemenet 3 bájtos kulcsában, és mind a 32 oszlop egy bitnek a kimeneti hashben. A színek azt jelzik, hogy egy bemeneti bit mennyire befolyásolja az adott kimeneti bitet: a zöld négyzet a jó keverést, a sárga négyzet kis keveredést, a piros pedig azt, hogy nincs keverés. Amint az ábrán látható, a beviteli kulcs utolsó bájtjában csak néhány bit keveredik lazán az eredmény néhány bitjével.
A lookup2 függvény az egy az egyben függvény köztes változata volt.
A lookup3 függvény a bemenetet egyenként 12 bájtos (96 bites) blokkra bontja. [1] Ez a viselkedés megfelelőbb lehet, ha a sebesség fontosabb, mint az egyszerűség. Ne feledje, hogy ezzel a hash-változattal a teljesítménynövekedés csak nagy kulcsok esetén valószínű, és a megvalósítás megnövekedett összetettsége éppen ellenkezőleg, a teljesítmény lelassulását okozhatja. Például amiatt, hogy a fordító esetleg nem tudja behelyettesíteni a függvényt.
Hash függvények | |
---|---|
Általános rendeltetésű | |
Kriptográfia | |
Kulcsgenerálási funkciók | |
Csekkszám ( összehasonlítás ) | |
Hashes |
|