Funcția hash Jenkins

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 6 februarie 2019; verificările necesită 3 modificări .
Funcții hash Jenkins
Prima publicat 1997
Tip de funcția hash

Funcțiile hash Jenkins sunt o familie de funcții hash de uz general pentru chei cu lungime variabilă dezvoltate de Bob Jenkins. Funcțiile pot fi utilizate și ca sumă de control pentru a detecta coruperea accidentală a datelor sau pentru a detecta înregistrări identice într- o bază de date . Descrierea funcției a fost publicată pentru prima dată în 1997.

Funcții hash

unul la o dată

Textul funcției de mai sus este preluat de pe pagina web a lui Bob Jenkins și este o versiune extinsă publicată de autor în Jurnalul Dr. Dobbs.

uint32_t jenkins_one_at_a_time_hash ( unsigned char * key , size_t len ​​​​) { uint32_t hash , i ; pentru ( hash = i = 0 ; i < len ; ++ i ) { hash += tasta [ i ]; hash += ( hash << 10 ); hash ^= ( hash >> 6 ); } hash += ( hash << 3 ); hash ^= ( hash >> 11 ); hash += ( hash << 15 ); returnează hash ; }

Figura din dreapta arată efectul de avalanșă al funcției.

Fiecare dintre cele 24 de rânduri corespunde unui bit din cheia de 3 octeți din intrare, iar fiecare dintre cele 32 de coloane corespunde unui bit din hash-ul de ieșire. Culorile indică cât de bine un bit de intrare afectează un bit de ieșire dat: un pătrat verde indică o amestecare bună, un pătrat galben indică o amestecare redusă, iar roșu ar indica lipsa amestecării. După cum se poate vedea din figură, doar câțiva biți din ultimul octet al tastei de intrare sunt amestecați lejer cu câțiva biți din rezultat.

lookup2

Funcția lookup2 a fost o versiune intermediară a funcției unu-la-o dată.

lookup3

Funcția lookup3 împarte intrarea în blocuri de 12 octeți fiecare (96 de biți). [1] Acest comportament poate fi mai potrivit atunci când viteza este mai importantă decât simplitatea. Rețineți că câștigul de performanță cu această variantă hash este probabil doar pentru chei mari și că, dimpotrivă, complexitatea crescută a implementării poate duce la încetinirea performanței. De exemplu, din cauza faptului că compilatorul nu poate înlocui funcția inline.

Link -uri

  1. Bob Jenkins, cod sursă lookup3.c . Din 16 aprilie 2009.