Einführung in die Hashing-Funktion in Java
Da wir wissen, dass Java eine objektorientierte Sprache ist, sollte es einen Mechanismus geben, um den Zustand eines Objekts zu beschreiben, egal wie groß ein Objekt sein mag. Die Hashing-Funktion in Java wurde entwickelt, um diese Anforderung zu erfüllen.
Was ist eine Hashing-Funktion?
Eine Hash-Funktion kann als eine Funktion definiert werden, die einen ganzzahligen Wert zurückgibt, der einem Objekt entspricht. Die Hash-Funktion gibt immer denselben ganzzahligen Wert für dasselbe Objekt zurück. Der von der Hash-Funktion zurückgegebene ganzzahlige Wert heißt Hash-Wert. Im Folgenden sind die wichtigen Punkte in Bezug auf die Hash-Funktion aufgeführt:
- Gibt für ein Objekt immer eine Ganzzahl (4 Byte) zurück.
- Wir können den Objektzustand nicht aus dem Hash-Wert berechnen, da Hash-Funktionen irreversibler Natur sind.
- Zwei gleiche Objekte haben den gleichen Hashwert.
- Zwei ungleiche Objekte haben nicht immer unterschiedliche Hash-Werte.
Anwendungen der Hash-Funktion
Hier sind die häufigsten Anwendungen von Hash-Funktionen:
1. Datenstrukturen
Fast jede Programmiersprache enthält Hash-basierte Datenstrukturen. Java enthält beispielsweise eine Hash-Tabelle, eine Hash-Map, ein Hash-Set und Tree-Set-Datenstrukturen, die auf der Hash-Funktion basieren. Die Basis dieser Datenstrukturen ist das Schlüssel-Wert-Design, bei dem jeder Schlüssel eindeutig ist, während für mehrere Schlüssel der gleiche Wert existieren kann.
2. Message Digest
Dieser Algorithmus wird bei einer Datenintegritätsprüfung verwendet. Dieser Algorithmus nimmt eine Nachricht beliebiger Länge als Eingabe und erzeugt Daten fester Länge (128 Bit) als Ausgabe. Beispiele für die Message-Digest-Algorithmen sind MD2, MD4, MD5 und MD6.
3. Sicherer Hash-Algorithmus
Dieser Algorithmus dient der Datensicherheit und wird in Anwendungen und Protokollen wie Secure Socket Layer (SSL) verwendet. SHA-0, SHA-1, SHA-2 und SHA-3 sind übliche Kategorien des Secure Hash-Algorithmus.
4. Passwortüberprüfung und Speicherung
Betrachten wir ein Anmeldeszenario, in dem bei der Eingabe eines Kennworts zur Authentifizierung eines Benutzers ein Hashwert des eingegebenen Kennworts berechnet und über das Netzwerk an den Server gesendet wird, auf dem der Hash des Originals gespeichert ist. Dies geschieht, um sicherzustellen, dass kein Sniffing durchgeführt wird, wenn ein Kennwort vom Client an den Server gesendet wird.
5. Compiler-Betrieb
Da in einer Programmiersprache unterschiedliche Schlüsselwörter verwendet werden, verwendet der Compiler zur Unterscheidung zwischen diesen Schlüsselwörtern und Bezeichnern einen Hash-Satz, der mithilfe einer Hash-Tabelle implementiert wird, um alle diese Schlüsselwörter und Bezeichner zu speichern.
6. Rabin-Karp-Algorithmus
Es ist ein Suchalgorithmus, der das Hashing verwendet, um nach einem oder mehreren Mustern in einer bestimmten Zeichenfolge zu suchen. Es ist einer der am häufigsten verwendeten Algorithmen.
7. Vergleichbare und Komparator-Schnittstellen
Diese Schnittstellen enthalten Funktionen, mit denen zwei Objekte gleichzeitig verglichen werden. Der Rückgabewert dieser Funktionen kann negativ, null oder positiv sein, je nachdem, ob ein bestimmtes Objekt kleiner, gleich oder größer als das Objekt ist, mit dem wir vergleichen. Interner Komparator und vergleichbare Schnittstellen verwenden eine Hash-Funktion, um Objekte miteinander zu vergleichen.
8. Prioritätswarteschlange
Die Prioritätswarteschlange unterscheidet sich von der normalen Warteschlange, die der FIFO-Reihenfolge (First in First out) folgt. In der Priorität Warteschlangenelemente werden in einer benutzerdefinierten Reihenfolge basierend auf ihrer Priorität angeordnet, die intern unter Verwendung von Vergleichs- und Komparatorfunktionen implementiert wird, die auf Hashfunktionen basieren.
Entwerfen von Hash-Funktionen
Hier einige allgemeine Entwurfsprinzipien zum Erstellen von Hashfunktionen:
- Eine Hash-Funktion sollte effizient ausgewertet werden.
- Aus Hash-Funktionen berechnete Hash-Werte sollten gleichmäßig verteilt sein, um Kollisionen zu vermeiden.
- Die Java-Programmiersprache bietet eine allgemeine Hashfunktion mit der Methode hashCode () in der Object-Superklasse.
public int hashCode ()(
//Logic goes here
)
Hash-Kollision in Java
Eine Hash-Kollision tritt auf, wenn zwei oder mehr Objekte denselben Hash-Wert zurückgeben. Nehmen wir ein Beispiel für eine Java-Hash-Map, in der Daten in Schlüssel-Wert-Paaren gespeichert werden. Wenn wir ein Objekt in eine Hash-Map einfügen, wird der Hash-Wert des Schlüssels berechnet und basierend auf dieser Position des Hash-Wert-Buckets zum Speichern des Wertobjekts gefunden. Objekte mit unterschiedlichen Hashwerten müssen in unterschiedliche Buckets verschoben werden. Wenn zwei oder mehr Objekte denselben Hashwert haben, werden sie unter Verwendung einer zusätzlichen Datenstruktur, die als verknüpfte Liste bezeichnet wird, am selben Speicherort gespeichert. Alle Objekte mit demselben Hashwert werden über eine verknüpfte Liste miteinander verkettet. Dieser Mechanismus wird Verkettung genannt. Die folgenden Möglichkeiten zum Behandeln von Kollisionen sind eine Hash-Funktion:
- Verkettung: Wie bereits erläutert, besteht die Idee der Verkettung darin, eine verknüpfte Liste von Objekten mit demselben Hashwert zu erstellen. Das Verketten ist eine einfache Technik, erfordert jedoch zusätzlichen Speicheraufwand.
- Offene Adressierung: Bei dieser Technik werden alle Elemente in einer Hash-Tabelle gespeichert, in der jeder Eintrag entweder einen Datensatz oder NULL enthält. Wenn ein Element durchsucht wird, wird jeder Eintrag in der Hash-Tabelle nach dem gewünschten Datensatz durchsucht, bis der erforderliche Datensatz gefunden wird oder die Schlussfolgerung gezogen wird, dass der Datensatz nicht in der Tabelle vorhanden ist.
Vorteile von Hashing
Das Folgende sind die Vorteile von Hashing:
- Vergleichen Sie den Inhalt zweier Dateien einfach und effizient, ohne sie zu öffnen.
- Hash-Funktionen werden zum Überprüfen der Integrität einer Datei verwendet.
- Mit Hilfe von Hashing ist die Suchoperation in Datenstrukturen schneller geworden.
- Hash-Funktionen spielen eine wichtige Rolle für die Datensicherheit, da die meisten Sicherheitsalgorithmen und -protokolle Hashing verwenden.
- Beim Hashing werden Daten in einen kürzeren Wert oder Schlüssel mit fester Länge konvertiert, der die ursprüngliche Zeichenfolge darstellt, die über das Netzwerk gesendet werden kann.
Nachteile von Hashing
Neben den Vorteilen gibt es auch einige Einschränkungen beim Hashing:
- Hashing kann nicht zum Sortieren von Daten implementiert werden.
- Die Hash-Kollision kann praktisch nicht vermieden werden, was wiederum zu Ineffizienz führt.
Empfohlene Artikel
Dies ist eine Anleitung zur Hashing-Funktion in Java. Hier diskutieren wir Anwendungen der Hash-Funktion mit Vor- und Nachteilen. Sie können sich auch die folgenden Artikel ansehen, um mehr zu erfahren -
- Deklaration und Initialisierung von VB.Net
- Java-Programm mit HashMap und TreeMap
- Arten von Hashing in DBMS
- Techniken der Steganographie
- Arrays in der Java-Programmierung
- Hashmap in Java