¿Es xxhash un hash unidireccional?

-1

¿Es xxhash un algoritmo hash unidireccional?

La documentación no indica esto.

    
pregunta Vivek Maharajh 21.08.2017 - 20:49
fuente

1 respuesta

3

Hmm, la documentación en xxhash parece difícil de encontrar. Indica claramente que es "para uso no criptográfico", por lo que probablemente depende de lo que entiendas por "unidireccional".

Mirando el código fuente , la magia parece suceder aquí (línea 247 , y línea 278):

/* *******************************************************************
*  32-bits hash functions
*********************************************************************/
static const U32 PRIME32_1 = 2654435761U;
static const U32 PRIME32_2 = 2246822519U;
static const U32 PRIME32_3 = 3266489917U;
static const U32 PRIME32_4 =  668265263U;
static const U32 PRIME32_5 =  374761393U;

static U32 XXH32_round(U32 seed, U32 input)
{
    seed += input * PRIME32_2;
    seed  = XXH_rotl32(seed, 13);
    seed *= PRIME32_1;
    return seed;
}

...

if (len>=16) {
    const BYTE* const limit = bEnd - 16;
    U32 v1 = seed + PRIME32_1 + PRIME32_2;
    U32 v2 = seed + PRIME32_2;
    U32 v3 = seed + 0;
    U32 v4 = seed - PRIME32_1;

    do {
            v1 = XXH32_round(v1, XXH_get32bits(p)); p+=4;
            v2 = XXH32_round(v2, XXH_get32bits(p)); p+=4;
            v3 = XXH32_round(v3, XXH_get32bits(p)); p+=4;
            v4 = XXH32_round(v4, XXH_get32bits(p)); p+=4;
        } while (p<=limit);

        h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
    } else {
        h32  = seed + PRIME32_5;
    }

    h32 += (U32) len;

    while (p+4<=bEnd) {
        h32 += XXH_get32bits(p) * PRIME32_3;
        h32  = XXH_rotl32(h32, 17) * PRIME32_4 ;
        p+=4;
    }

    while (p<bEnd) {
        h32 += (*p) * PRIME32_5;
        h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;
        p++;
    }

    h32 ^= h32 >> 15;
    h32 *= PRIME32_2;
    h32 ^= h32 >> 13;
    h32 *= PRIME32_3;
    h32 ^= h32 >> 16;

    return h32;

"Unidireccional" en criptografía significa que no es computacionalmente reversible revertirla o generar colisiones. Dado que esto es un cambio de bits más un montón de adiciones, multiplicaciones y exponenciaciones con primos de arreglos y un módulo fijo (32 bytes). Probablemente podrías crear un algoritmo basado en el Teorema del Resto chino para romperlo. Entonces, como dice la documentación, ciertamente no es "unidireccional" en el sentido criptográfico de la palabra.

Tenga en cuenta que hay otras definiciones de "unidireccional" que tienen sentido en un sentido no criptográfico. Por ejemplo, la función hash de tomar las iniciales de una persona es "unidireccional" en el sentido de que JS también podría ser Jon Snow , Jane Smith , Johann Sebastian , etc.

    
respondido por el Mike Ounsworth 21.08.2017 - 21:13
fuente

Lea otras preguntas en las etiquetas