MurmurHash2

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 6 juni 2022; kontroller kräver 2 redigeringar .

MurmurHash2  är en enkel och snabb hashfunktion för allmänna ändamål utvecklad av Austin Appleby. Inte kryptografiskt säkert , returnerar ett 32-bitars osignerat nummer.

Bland fördelarna med funktionen noterade författarna enkelhet, bra distribution, kraftfull lavineffekt , hög hastighet och relativt hög motståndskraft mot kollisioner . De nuvarande versionerna av algoritmen är optimerade för Intel -kompatibla processorer.

Exempelkod

osignerad int MurmurHash2 ( char * nyckel , osignerad int len ​​) { const unsigned int m = 0x5bd1e995 ; const unsigned int seed = 0 ; const int r = 24 ; osignerad int h = frö ^ len ; const unsigned char * data = ( const unsigned char * ) nyckel ; osignerad int k = 0 ; medan ( len >= 4 ) { k = data [ 0 ]; k |= data [ 1 ] << 8 ; k |= data [ 2 ] << 16 ; k |= data [ 3 ] << 24 ; k *= m ; k ^= k >> r ; k *= m ; h *= m ; h ^= k ; data += 4 ; len -= 4 ; } switch ( len ) { fall 3 : h ^= data [ 2 ] << 16 ; fall 2 : h ^= data [ 1 ] << 8 ; fall 1 : h ^= data [ 0 ]; h *= m ; }; h ^= h >> 13 ; h *= m ; h ^= h >> 15 ; returnera h ; }

MurmurHash 2A

Den andra versionen av hashfunktionen har vissa nackdelar. I synnerhet är detta problemet med kollisioner på små strängar. Den korrigerade versionen har en Merkle-Damgard-typstruktur , går lite långsammare (cirka 20%), men visar bättre statistik.

#define mmix(h,k) { k *= m; k ^= k >> r; k*=m; h *= m; h ^= k; } osignerad int MurmurHash2A ( const void * nyckel , int len ​​, osignerad int seed ) { const unsigned int m = 0x5bd1e995 ; const int r = 24 ; osignerad int l = len ; const unsigned char * data = ( const unsigned char * ) nyckel ; osignerad int h = frö ; osignerad int k ; medan ( len >= 4 ) { k = * ( osignerad int * ) data ; mmix ( h , k ); data += 4 ; len -= 4 ; } osignerad int t = 0 ; switch ( len ) { fall 3 : t ^= data [ 2 ] << 16 ; fall 2 : t ^= data [ 1 ] << 8 ; fall 1 : t ^= data [ 0 ]; }; mmix ( h , t ); mmix ( h , 1 ); h ^= h >> 13 ; h *= m ; h ^= h >> 15 ; returnera h ; }

Länkar