Ich habe gehört, dass das Wort "Hash" in verschiedenen Kontexten (alle innerhalb der Computerwelt) mit unterschiedlichen Bedeutungen verwendet wird. In dem Buch Learn Python the Hard Way heißt es beispielsweise im Kapitel über Wörterbücher : "Python nennt sie" Diktate. "Andere Sprachen nennen sie" Hashes "." Sind es also Hashes-Wörterbücher? "
Die andere gebräuchliche Verwendung des Wortes bezieht sich auf die Verschlüsselung. Ich habe auch Leute gehört (& gelesen), die das Wort "Hash" als eine bestimmte Funktion innerhalb der High-Level-Programmierung verwendeten.
Also, was genau ist das?
Kann irgendjemand (mit der Zeit und wer kennt sich aus) freundlich erklären, warum "Hash (oder Hashes)" so eine Sache sind?
terminology
hashing
gracedlamb
quelle
quelle
Antworten:
Der Wikipedia-Artikel über Hash-Funktionen ist sehr gut, aber ich werde hier mein Einverständnis geben.
Was ist ein Hash?
"Hash" ist wirklich ein weiter Begriff mit unterschiedlichen formalen Bedeutungen in unterschiedlichen Kontexten. Es gibt keine perfekte Antwort auf Ihre Frage. Ich werde das allgemeine Grundkonzept erläutern und einige der gebräuchlichsten Verwendungen des Begriffs erwähnen.
Ein "Hash" ist eine Funktion , die als Hash-Funktion bezeichnet wird und als Eingabeobjekte eine Zeichenfolge oder Zahl ausgibt. Die Eingabeobjekte sind normalerweise Mitglieder grundlegender Datentypen wie Zeichenfolgen, Ganzzahlen oder größerer Datentypen, die aus anderen Objekten wie benutzerdefinierten Strukturen bestehen. Die Ausgabe ist normalerweise eine Zahl oder eine Zeichenfolge. Das Substantiv "Hash" bezieht sich oft auf diese Ausgabe. Das Verb "Hash" bedeutet oft "eine Hash-Funktion anwenden". Die wichtigsten Eigenschaften, die eine Hash-Funktion haben sollte, sind:h
Beispiel:
Angenommen, wir möchten Hash-Zahlen im Bereich von 0 bis 999.999.999 bis zu Zahlen zwischen 0 und 99 verwenden. Eine einfache Hash-Funktion kann .h ( x ) = xmod100
Gemeinsame zusätzliche Eigenschaften:
Je nach Anwendungsfall möchten wir, dass die Hash-Funktion zusätzliche Eigenschaften erfüllt. Hier sind einige übliche zusätzliche Eigenschaften:
Einheitlichkeit : Oft möchten wir, dass die Hashes von Objekten unterschiedlich sind. Außerdem möchten wir, dass die Hashes "ausgebreitet" werden. Wenn ich einige Objekte in 100 Buckets hacken möchte (die Ausgabe meiner Hash-Funktion ist also eine Zahl von 0-99), dann hoffe ich normalerweise, dass ungefähr 1/100 Objekte in Bucket 0 landen, ungefähr 1/100 in Eimer 1 und so weiter.
Widerstand gegen kryptografische Kollisionen : Manchmal wird dies sogar noch weiter vorangetrieben. In der Kryptografie möchte ich möglicherweise eine Hash-Funktion, sodass es für einen Gegner rechnerisch schwierig ist, zwei verschiedene Eingänge zu finden, die demselben Ausgang zugeordnet sind.
Komprimierung : Ich möchte häufig willkürlich große Eingaben in eine Ausgabe mit konstanter Größe oder eine feste Anzahl von Buckets zerlegen.
Determinismus : Möglicherweise möchte ich eine Hash-Funktion, deren Ausgabe sich zwischen den Durchläufen nicht ändert, dh die Ausgabe der Hash-Funktion für dasselbe Objekt bleibt immer gleich. Dies scheint im Widerspruch zur obigen Gleichförmigkeit zu stehen, aber eine Lösung besteht darin, die Hash-Funktion zufällig einmal auszuwählen und nicht zwischen den Durchläufen zu ändern.
Einige Anwendungen
Eine häufige Anwendung sind Datenstrukturen wie eine Hash-Tabelle, mit denen Wörterbücher implementiert werden können. Hier ordnen Sie Speicher zu, beispielsweise 100 "Buckets". Wenn Sie dann aufgefordert werden, ein (Schlüssel-, Wert-) Paar im Wörterbuch zu speichern, haben Sie den Schlüssel in eine Zahl von 0 bis 99 gehasht und das Paar im entsprechenden Bucket gespeichert. Wenn Sie dann aufgefordert werden, einen Schlüssel nachzuschlagen, wird der Schlüssel mit derselben Hash-Funktion in eine Zahl von 0 bis 99 gehasht und in diesem Bucket überprüft, ob sich der Schlüssel dort befindet. In diesem Fall geben Sie den Wert zurück.
Beachten Sie, dass Sie Wörterbücher auch auf andere Weise implementieren können, z. B. mit einem binären Suchbaum (wenn Ihre Objekte vergleichbar sind).
Eine weitere praktische Anwendung sind Prüfsummen, mit denen überprüft werden kann, ob zwei Dateien identisch sind (z. B. wurde die Datei gegenüber der vorherigen Version nicht beschädigt). Da es sehr unwahrscheinlich ist, dass Hash-Funktionen zwei Eingaben derselben Ausgabe zuordnen, berechnen und speichern Sie einen Hash der ersten Datei, der normalerweise als Zeichenfolge dargestellt wird. Dieser Hash ist sehr klein, vielleicht nur ein paar Dutzend ASCII-Zeichen. Wenn Sie dann die zweite Datei erhalten, prüfen Sie, ob die Ausgabe identisch ist. In diesem Fall handelt es sich mit ziemlicher Sicherheit Byte für Byte um dieselbe Datei.
Eine andere Anwendung ist die Kryptographie, bei der es schwierig sein sollte, diese Hashes zu "invertieren" - das heißt, angesichts der Ausgabe und der Hash-Funktion sollte es schwierig sein, die Eingaben zu ermitteln, die zu dieser Ausgabe geführt haben. Eine Verwendung davon ist für Kennwörter: Anstatt das Kennwort selbst zu speichern, speichern Sie einen kryptografischen Hash des Kennworts (möglicherweise mit einigen anderen Bestandteilen). Wenn ein Benutzer ein Kennwort eingibt, berechnen Sie seinen Hash und überprüfen, ob er mit dem richtigen Hash übereinstimmt. Wenn ja, sagen Sie, dass das Passwort korrekt ist. (Jetzt hat auch jemand, der den auf dem Server gespeicherten Hash nachsehen und herausfinden kann, nicht so leicht die Möglichkeit, sich als Benutzer auszugeben.) Bei dieser Anwendung ist die Ausgabe möglicherweise genauso lang oder länger als die Eingabe, da Die Eingabe ist so kurz.
quelle
Eine Hash-Funktion ist eine Funktion, die eine Eingabe entgegennimmt und einen Wert fester Größe erzeugt. Beispielsweise könnten Sie eine Hash-Funktion haben
stringHash
, die einestring
beliebige Länge akzeptiert und eine 32-Bit-Ganzzahl erzeugt.Typischerweise ist es richtig zu sagen, dass die Ausgabe einer Hash-Funktion ein Hash ist (auch bekannt als Hash-Wert oder Hash-Summe). Manchmal wird die Funktion jedoch als Hash bezeichnet . Dies ist technisch inkorrekt, wird jedoch normalerweise übersehen, da allgemein (im Kontext) davon ausgegangen wird, dass die Person die Hash-Funktion gemeint hat .
Die typische Verwendung einer Hash-Funktion ist die Implementierung einer Hash-Tabelle . Eine Hash-Tabelle ist eine Datenstruktur, die Werte mit anderen Werten verknüpft, die normalerweise als Schlüssel bezeichnet werden. Hierzu wird eine Hash-Funktion für den Schlüssel verwendet, um einen Hash-Wert mit fester Größe zu erstellen, mit dem die gespeicherten Daten schnell nachgeschlagen werden können. Ich werde nicht im Detail darauf eingehen, wie es das macht, aber die wichtigste Tatsache hier ist, dass es eine Hash-Tabelle heißt, weil es auf einer Hash-Funktion beruht , um Hash-Werte (Hashes) zu erzeugen .
Hier kommt ein Teil der Verwirrung ins Spiel, weil einige Leute (wieder etwas falsch) eine Hash-Tabelle als Hash bezeichnen. Wie in anderen Antworten angegeben, bezieht sich die Implementierung einer Hash-Tabelle in einer bestimmten Sprache manchmal auf die Hash-Tabelle als Hash (insbesondere Perl tut dies, obwohl ich erwarte, dass dies auch in anderen Sprachen der Fall ist). Andere Sprachen beziehen sich auf die Implementierung einer Hash-Tabelle als Wörterbuch. Python ist eine dieser Sprachen, aber aufgrund der Verankerung in der jeweiligen Sprache verkürzen viele Python-Benutzer den Begriff Wörterbuch, um ihn zu diktieren.
Während sich die korrekte Verwendung des Begriffs Hash auf den von einer Hash-Funktion erzeugten Hash-Wert bezieht, wird der Begriff manchmal auch informell verwendet, um auf Hash-Funktionen und Hash-Tabellen zu verweisen , was zu Verwirrung führt.
quelle
Eine Hash-Funktion ist im Großen und Ganzen jede Funktion, bei der das Bild kleiner als die Domäne ist . Die Ausgabe einer solchen Funktion
f(x)
kann als "der Hash vonx
" bezeichnet werden.In der Informatik begegnen wir normalerweise zwei Anwendungen von Hash-Funktionen.
Die erste Möglichkeit betrifft Datenstrukturen wie Hash-Tabellen , in denen die Schlüsseldomäne (z. B. 32-Bit-Ganzzahlen oder Zeichenfolgen beliebiger Länge) einem Array-Index (z. B. Ganzzahl zwischen 0 und 100) zugeordnet werden soll. Ziel ist es, die Leistung der Datenstruktur zu maximieren. Eigenschaften der Hash-Funktion, die typischerweise wünschenswert sind, sind Einfachheit und gleichmäßige Ausgabeverteilung.
Perl nennt seinen eingebauten assoziativen Array-Typ "Hash" , was hier für Verwirrung zu sorgen scheint. Ich kenne keine anderen Sprachen, die dies tun. Die Datenstruktur kann lose als Hash-Funktion selbst gesehen werden (wobei die Domäne der aktuelle Satz von Schlüsseln ist), ist aber auch als Hash-Tabelle implementiert.
Die zweite dient der Kryptografie : Nachrichtenauthentifizierung, Kennwort- / Signaturüberprüfung usw. Die Domäne besteht normalerweise aus beliebigen Byte-Zeichenfolgen. Hier geht es um Sicherheit - was manchmal eine absichtlich geringe Leistung bedeutet -, wo nützliche Eigenschaften Kollision und Beständigkeit vor dem Bild sind.
quelle
MikesHash()
die Zeichenfolgen der Länge 12 akzeptiert und sie an SHA-512 übergibt und die Ausgabe zurückgibt. Ich bin mir ziemlich sicher, dass diesMikesHash()
immer noch der Definition einer Hash-Funktion entspricht. (In der Praxis haben Sie recht, die von uns verwendeten Hash-Funktionen akzeptieren Eingaben beliebiger Länge, aber ich glaube nicht, dass etwas nicht zu einer Hash-Funktion wird, wenn dies nicht der Fall ist.)Große Frage Basil Ajith,
Hier ist meine Perspektive, was ein Hash für etwas ist, an dem ich heute arbeite.
*
*
Zieht den Auditorenhut an, ich meine Zaubererrobe
Hash ist ein Wert / string / whatever / label. Stellen Sie sicher, dass er auf Ihrem Computer mit der Quelle eines Downloads identisch ist.
quelle
Ich werde versuchen, nur eine kurze Zusammenfassung dessen hinzuzufügen, was andere sagen.
Hash-Funktion
Es gibt eine spezielle Art von Funktionen, die als Hash-Funktionen bezeichnet werden.
"SHA256 ist eine bekannte Hash-Funktion, die kryptografisch sicher ist"
Drei Hauptanwendungen sind * Hash-Tabellen, * Prüfsummen (Datenintegritätsprüfungen, z. B. in Festplatten oder ADSL-Protokollen) * und Kryptografie (verschiedene Formen der kryptografischen Authentifizierung, einschließlich, aber nicht beschränkt auf digitale Signaturen und sichere Speicherung von Passwörtern).
Hash-tabelle
Hash-Tabelle ist eine Datenstruktur für die schnelle Suche. Intern werden Hash-Funktionen verwendet, daher der Name.
"Datenbanken verwenden Hash-Tabellen und Suchbäume intern, um die Ausführung von Suchanfragen zu beschleunigen"
Hash
"Hash" ist der offizielle Name der in Perl integrierten Wörterbücher. Sie sind intern Hash-Tabellen, daher der Name. Msgstr "Diese Unterroutine akzeptiert einen Hash als erstes Argument". Diese Tage können für jedes assoziative Array verwendet werden, nicht unbedingt für eine Hash-Tabelle.
Msgstr "MD5 - Hashes der .iso - Images werden bereitgestellt, um ihre Integrität nach dem Download zu überprüfen".
quelle