Perché si chiama "tabella hash" o "funzione hash"? Hash non ha alcun senso per me qui [chiuso]


26

Sono circa 4 anni di sviluppo che sto usando, ascoltando, parlando e implementando tabelle hash e funzioni hash. Ma davvero non capisco mai perché si chiama hash?

Ricordo i primi giorni in cui ho iniziato a programmare, questo termine per me era una specie di terminologia ingombrante . Non ho mai capito di cosa si tratta, in base al suo nome . Ho solo sperimentalmente capito cosa fa e perché e quando dovremmo usarlo .

Tuttavia, a volte cerco ancora di capire perché si chiama hash . Non ho alcun problema con la tabella o la funzione e, ad essere onesti, sono termini piuttosto deduttivi e razionali. Tuttavia, penso che potrebbero essere usate parole migliori al posto dell'hash, come chiave o unicità . Non digitare la tabella o la tabella di unicità .

Secondo il mio dizionario, hash significa:

  1. Piatto fritto di patate e carne (altamente irrilevante)
  2. # simbolo (segno del numero AKA, cancelletto, ecc.) (ancora irrilevante, forse solo una nomenclatura errata)
  3. Applica l'algoritmo alla stringa di caratteri (non ha ancora nulla a che fare con l' unicità , che è la caratteristica più importante di una tabella hash)
  4. Tagliare il cibo
  5. Un altro termine per hashish

Qualcuno sa perché si chiama hash?


32
Sembri fraintendere leggermente cosa sono gli hash. L'unicità non è esplicitamente una caratteristica delle funzioni hash (cioè non sono mai iniettive).
Peter Taylor,

1
@Peter Taylor: le tabelle hash definiscono i mapping iniettivi.
reinierpost,

2
@Peter Taylor: per essere un po 'pignoli, non hanno bisogno di essere iniettivi , ma a volte sono anche biiettivi. Pensa all'implementazione tipica di una funzione di hashing per un numero intero :)
keppla

4
Un hash può essere unico, purché lo spazio chiave non sia maggiore dello spazio del valore hash (per gli hash delle tabelle) o lo spazio del valore hash sia così grande che le collisioni sono matematicamente impossibile (per gli hash crittografici).
Sicuro il

1
Inoltre, una "tabella di chiavi" suona più come qualsiasi struttura di dati "chiave / valore" (chiamata anche "dizione"). Non tutte le strutture dati chiave / valore sono tabelle hash.
Barjak,

Risposte:


46

Secondo Wikipedia, si riferisce alla funzione hash . Se vuoi fare un passo ulteriore, la pagina wiki per la funzione hash dice che l'uso della parola "hash" nella funzione hash ha avuto origine in questo modo:

Il termine "hash" deriva dall'analogia con il suo significato non tecnico, per "tagliare e mescolare". In effetti, le tipiche funzioni hash, come l'operazione mod, "tagliano" il dominio di input in molti sottodomini che vengono "mescolati" nell'intervallo di output per migliorare l'uniformità della distribuzione delle chiavi.


2
Non sono sicuro di cosa stiano facendo i "sottodomini". È solo che la funzione hash 'mescola' in modo completo i valori del suo dominio.
reinierpost,

15

In francese, una tabella di hash si chiama "table de hachage", il verbo correlato "hacher" significa tritare / tritare (cibo principalmente). Il verbo to hashha lo stesso significato in inglese.

Quindi, come altri hanno sottolineato, si chiama hash, perché truci i tuoi input e li metti in pezzi in luoghi diversi (le voci della tabella).


2
In realtà è scritto "hachage" e "hacher" senza accento.
Ptival,

10

Il numero 3 ha tutto a che fare con esso. Da Wikipedia :

Al centro dell'algoritmo della tabella hash è una semplice serie di elementi; questo è spesso chiamato semplicemente tabella hash . Gli algoritmi della tabella hash calcolano un indice dalla chiave dell'elemento dati e usano questo indice per posizionare i dati nell'array. L'implementazione di questo calcolo è la funzione di hash , f:

index = f(key, arrayLength)

La funzione hash calcola indexall'interno dell'array dai dati key. arrayLengthè la dimensione dell'array. Per il linguaggio assembly o altri programmi di basso livello, una banale funzione hash può spesso creare un indice con solo una o due istruzioni macchina in linea .

Quindi una tabella hash non memorizza realmente i valori in base a una chiave; memorizza i valori in base a una versione con hash di quella chiave.


1
dipende da cosa intendi per tabella hash. La struttura dei dati offerta in linguaggi come Perl, Java e C # offre una mappatura chiave-valore, utilizzando il tipo di tabella hash a cui si fa riferimento internamente.
reinierpost,

10

le tabelle hash vengono chiamate in questo modo a causa dell'utilizzo del codice hash ed è correlata al "taglio degli alimenti".

Pensalo in questo modo - prendi il tuo bel oggetto carino, come un frutto, quindi lo tagli in modo che inizi a sembrare come qualsiasi altra cosa - solo un numero - non c'è più struttura in esso. Quel pezzo di "cibo tagliato" viene utilizzato nella tabella hash per scoprire il tuo bel oggetto carino.

  • Sembra più brutto del tuo grazioso oggetto? forse - ma aiuta a trovarlo velocemente - questo è il punto. oh e non è unico questo è certo.
     
    Il codice hash trova un bucket nella tabella in cui il tuo oggetto carino si trova in una piccola compagnia di altri con lo stesso codice hash. All'interno di questa piccola azienda, l'oggetto viene cercato usando il controllo dell'uguaglianza - che dovrebbe essere molto più lento della ricerca dell'hash ma non è un grosso problema poiché ce ne sono solo alcuni (la maggior parte degli altri oggetti sono già ignorati grazie all'hash veloce) .

3

L'hashing (come nel tagliare in piccoli pezzi, triturare, ecc.) Richiede un input (cibo o talvolta supercattivo) e lo trasforma in un output relativamente omogeneo. Cioè non importa quello che hai avuto all'inizio, alla fine hai solo hash. E un cucchiaio di hash è utile quanto tutto l'hash nel determinare quale sia stato l'input (supponendo che gli hash della tua macchina di hash).
Quindi l'hashing può ridurre qualsiasi oggetto commestibile o malvagio in un cucchiaio di hash, in cui due oggetti diversi producono hash diversi, mentre due oggetti uguali producono hash uguali. Ciò significa che se due supercattivi cadono nella tua macchina di hashing, è sufficiente confrontare i loro hash per determinare se uno era un clone dell'altro.

In un certo senso le funzioni di hashing nell'informatica sono un po 'simili. Prendono un intero input di dimensioni e semantica diverse e, molto semplicemente, lo tagliano in pezzi e mescolano quelli intorno e ritagliano la sequenza risultante in pezzi e mescolano tutto intorno e così via. Alla fine hai un cucchiaio (n byte) dell'input che hai cancellato.


Tuttavia con l'avvertenza il super cattivo può anche restituire lo stesso hash di un supereroe con un determinato set di parametri poiché l'hashing non sembra dettare l'unicità. Dopo tutto ci sono delle collisioni di hash ... è quello che fai dopo la collisione ...
Rig
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.