MurmurHash2

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 6 de junio de 2022; las comprobaciones requieren 2 ediciones .

MurmurHash2 es una función hash de propósito general  simple y rápida desarrollada por Austin Appleby. No criptográficamente seguro , devuelve un número sin firmar de 32 bits .

Entre las ventajas de la función, los autores destacaron la simplicidad, la buena distribución, el poderoso efecto de avalancha , la alta velocidad y la resistencia relativamente alta a las colisiones . Las versiones actuales del algoritmo están optimizadas para procesadores compatibles con Intel.

Código de ejemplo

sin firmar int MurmurHash2 ( char * clave , sin firmar int len ) { const int sin signo m = 0x5bd1e995 ; const semilla int sin signo = 0 ; const int r = 24 ; sin signo int h = semilla ^ len ; const caracter sin signo * data = ( const caracter sin signo * ) clave ; int sin signo k = 0 ; mientras ( largo >= 4 ) { k = datos [ 0 ]; k |= datos [ 1 ] << 8 ; k |= datos [ 2 ] << 16 ; k |= datos [ 3 ] << 24 ; k *= metro ; k ^= k >> r ; k *= metro ; h *= metro ; h ^= k ; datos += 4 ; largo -= 4 ; } cambiar ( len ) { caso 3 : h ^= datos [ 2 ] << 16 ; caso 2 : h ^= datos [ 1 ] << 8 ; caso 1 : h ^= datos [ 0 ]; h *= metro ; }; h ^ = h >> 13 ; h *= metro ; h ^ = h >> 15 ; devuelve h ; }

MurmurHash 2A

La segunda versión de la función hash tiene algunas desventajas. En particular, este es el problema de las colisiones en cuerdas pequeñas. La versión corregida tiene una estructura tipo Merkle-Damgard , corre un poco más lento (alrededor del 20%), pero muestra mejores estadísticas.

#define mmix(h,k) { k *= m; k ^= k >> r; k*=m; h*= metro; h ^ = k; } unsigned int MurmurHash2A ( const void * key , int len , int seed sin firmar ) { const int sin signo m = 0x5bd1e995 ; const int r = 24 ; int sin signo l = len ; const caracter sin signo * data = ( const caracter sin signo * ) clave ; int sin signo h = semilla ; sin firmar int k ; mientras ( largo >= 4 ) { k = * ( int sin signo * ) datos ; mmix ( h , k ); datos += 4 ; largo -= 4 ; } int sin signo t = 0 ; cambiar ( len ) { caso 3 : t ^= datos [ 2 ] << 16 ; caso 2 : t ^= datos [ 1 ] << 8 ; caso 1 : t ^= datos [ 0 ]; }; mmix ( h , t ); mmix ( h , l ); h ^ = h >> 13 ; h *= metro ; h ^ = h >> 15 ; devuelve h ; }

Enlaces