MurmurHash2

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 6 iunie 2022; verificările necesită 2 modificări .

MurmurHash2 este o funcție hash de uz general  simplă și rapidă dezvoltată de Austin Appleby. Nu este sigur din punct de vedere criptografic , returnează un număr nesemnat pe 32 de biți .

Printre avantajele funcției, autorii au remarcat simplitatea, distribuția bună, efectul puternic de avalanșă , viteză mare și rezistență relativ mare la coliziuni . Versiunile actuale ale algoritmului sunt optimizate pentru procesoare compatibile Intel.

Exemplu de cod

unsigned int MurmurHash2 ( char * key , unsigned int len ​​​​) { const unsigned int m = 0x5bd1e995 ; const unsigned int seed = 0 ; const int r = 24 ; unsigned int h = seed ^ len ; const unsigned char * data = ( const unsigned char * ) cheie ; unsigned int k = 0 ; în timp ce ( len >= 4 ) { k = date [ 0 ]; k |= date [ 1 ] << 8 ; k |= date [ 2 ] << 16 ; k |= date [ 3 ] << 24 ; k *= m ; k ^= k >> r ; k *= m ; h *= m ; h ^= k ; date += 4 ; len -= 4 ; } comutator ( len ) { cazul 3 : h ^= date [ 2 ] << 16 ; cazul 2 : h ^= date [ 1 ] << 8 ; cazul 1 : h ^= date [ 0 ]; h *= m ; }; h ^= h >> 13 ; h *= m ; h ^= h >> 15 ; întoarce h ; }

MurmurHash 2A

A doua versiune a funcției hash are unele dezavantaje. În special, aceasta este problema ciocnirilor pe șiruri mici. Versiunea corectată are o structură de tip Merkle-Damgard , rulează puțin mai lent (aproximativ 20%), dar arată statistici mai bune.

#define mmix(h,k) { k *= m; k ^= k >> r; k*=m; h *= m; h ^= k; } unsigned int MurmurHash2A ( const void * key , int len ​​​​, unsigned int seed ) { const unsigned int m = 0x5bd1e995 ; const int r = 24 ; unsigned int l = len ; const unsigned char * data = ( const unsigned char * ) cheie ; unsigned int h = sămânță ; nesemnat int k ; în timp ce ( len >= 4 ) { k = * ( unsigned int * ) date ; mmix ( h , k ); date += 4 ; len -= 4 ; } unsigned int t = 0 ; comutator ( len ) { cazul 3 : t ^= date [ 2 ] << 16 ; cazul 2 : t ^= date [ 1 ] << 8 ; cazul 1 : t ^= date [ 0 ]; }; mmix ( h , t ); mmix ( h , l ); h ^= h >> 13 ; h *= m ; h ^= h >> 15 ; întoarce h ; }

Link -uri