xxhash è un hash unidirezionale?

-1

È xxhash un algoritmo di hash unidirezionale?

La documentazione non lo dice.

    
posta Vivek Maharajh 21.08.2017 - 20:49
fonte

1 risposta

3

Hmm, la documentazione su xxhash sembra difficile da trovare. Indica chiaramente che è "per uso non crittografico", quindi probabilmente dipende da cosa intendi per "unidirezionale".

Guardando il codice sorgente , la magia sembra accadere qui (linea 247 e riga 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;

"A senso unico" in crittografia significa che è computazionalmente impossibile da invertire o generare collisioni. Dal momento che questo è un po 'di spostamento, più un mucchio di aggiunte, moltiplicazioni e esponenziamenti con correzioni primes e un modulo fisso (32-byte). Probabilmente potresti inventare un algoritmo basato sul teorema del resto cinese per romperlo. Quindi, come dice la documentazione, non è certamente "a senso unico" nel senso crittografico della parola.

Si noti che esistono altre definizioni di "a senso unico" che hanno senso in un senso non crittografico. Ad esempio, la funzione hash di prendere le iniziali di una persona è "a senso unico" nel senso che JS potrebbe essere ugualmente Jon Snow , Jane Smith , Johann Sebastian , ecc.

    
risposta data 21.08.2017 - 21:13
fonte

Leggi altre domande sui tag