2009-06-29 13 views
16

Ho appena scoperto l'hash del mormorio, sembra essere il più veloce conosciuto e abbastanza resistente alle collisioni. Ho cercato di approfondire l'algoritmo o l'implementazione nel codice sorgente completo, ma ho difficoltà a capirlo. Qualcuno potrebbe spiegare l'algoritmo utilizzato o implementarlo in codice sorgente completo, preferibilmente in C. Ho letto il codice sorgente C dal sito dell'autore ma non ho idea, come: che cos'è seed, h, k, m? cosa vuol dire:Per favore, spiegate l'hash del mormorio?

k *= m; 
k ^= k >> r; 
k *= m; 

h *= m; 
h ^= k; 

data += 4; 
len -= 4; 

???

Riferimento: http://murmurhash.googlepages.com/

Ci dispiace per il mio inglese e la mia stupidità. Cheers

+7

Hai guardato wikipedia? http://en.wikipedia.org/wiki/MurmurHash – merkuro

+12

@merkuro Hai * guardato * l'articolo [Wikipedia] (http://en.wikipedia.org/wiki/MurmurHash)? –

risposta

4

Il codice è disponibile here. m e r sono costanti utilizzate dall'algoritmo. k * = m significa prendere la variabile k e moltiplicarla per m. k^= k >> r significa prendere k e spostare a destra i bit r posti (ad esempio se r è 2 110101 diventerebbe 001101) e quindi XOR con k.

La speranza che ti dà abbastanza per lavorare attraverso il resto.

saluti

2

la migliore spiegazione del Murmur algoritmo è sul Murmur Hash Wikipedia page:

 
Murmur3_32(key, len, seed) 
    //Note: In this version, all integer arithmetic is performed 
    //with unsigned 32 bit integers. In the case of overflow, 
    //the result is constrained by the application 
    //of modulo 232 arithmetic. 

    c1 ← 0xcc9e2d51 
    c2 ← 0x1b873593 
    r1 ← 15 
    r2 ← 13 
    m ← 5 
    n ← 0xe6546b64 

    hash ← seed 

    for each fourByteChunk of key 
     k ← fourByteChunk 

     k ← k × c1 
     k ← (k ROL r1) 
     k ← k × c2 

     hash ← hash XOR k 
     hash ← (hash ROL r2) 
     hash ← hash × m + n 

    with any remainingBytesInKey 
     remainingBytes ← SwapEndianOrderOf(remainingBytesInKey) 
     // Note: Endian swapping is only necessary on big-endian machines. 

     remainingBytes ← remainingBytes × c1 
     remainingBytes ← (remainingBytes ROL r1) 
     remainingBytes ← remainingBytes × c2 

     hash ← hash XOR remainingBytes 

    hash ← hash XOR len 

    hash ← hash XOR (hash SHR 16) 
    hash ← hash × 0x85ebca6b 
    hash ← hash XOR (hash SRH 13) 
    hash ← hash × 0xc2b2ae35 
    hash ← hash XOR (hash SHR 16) 

E la mia:

enter image description here

+0

Questo è il codice. Pseudo codice vero, abbastanza leggibile, ma continuo a non capire la '' spiegazione ''. Capisco cosa stanno facendo i passaggi, potrei scriverlo in più lingue, ma non capisco cosa ogni singolo passaggio contribuisca all'hash, tipo, matematicamente e roba. (Sto ancora cercando una buona spiegazione, non attaccando questa risposta o altro) – Noein

+0

@Noein E la bella immagine che ho appena aggiunto? –

+1

Beh, non dice nulla sulle proprietà matematiche in un modo che io posso capire ... Ma probabilmente sto superando me stesso: il diagramma mi ha aiutato a scrivere una versione senza guardare un'implementazione reale, più dello pseudo-codice, quindi grazie;) – Noein

Problemi correlati