Ich lerne Hashing-Techniken für Nachschlagevorgänge und Informationsabruf. Aber bevor ich tiefgrabe, bin ich mit bestimmten Konzepten über Hash-Funktionen im Allgemeinen verwirrt.Grundlegende Konzepte des Hashing von Vektoren
Angenommen, ich habe einen Eingang x
, der ein Vektor von Fließkommawerten ist, xi = [x_1,x_2,...,x_L]
. Die Größe des Vektors ist L
. Es gibt N
solche Vektoren, auch als Beispiele bezeichnet, X = [x1,x2,..,x_N]
. Bei einem Abfragevektor p
muss ich das nächste/nächste Beispiel finden, das mit der Abfrage übereinstimmt. Wenn Sie mehrere Lesestoffe durchgehen, ist die einfachste (aber ineffizienteste) Hashing-Funktion , wenn die Tabellengröße M=10
(sagen wir) ist.
x mod M
der Rest von x
ist, wenn durch M
geteilt, dann wird immer zwischen x mod M
0
und M -1
, können wir immer eine ganze Zahl mit einem der Schlitze M
kartieren. Meine Fragen:
Frage 1: Der Modul wird über die Tabellengröße durchgeführt. Wenn jedoch jede Probe die Länge L
hat und es N
solche Proben gibt, welche Modulo-Zahl dann darstellt? Würde h(x) = x mod vector length
oder h(x) = x
mod number of examples
?
In Kryptografieanwendungen wird normalerweise mod 256 verwendet, da jeder Block eine Größe von 8 Bits hat. Dies bedeutet, dass Modulus über die Länge des Vektors genommen wird? Bitte korrigiere mich wenn falsch.
Frage 2: Sollte ich die Fließkommazahlen in Ganzzahlen konvertieren, weil viele Beispiele zeigen, dass die Eingabe entweder ein ASCII-Wert oder eine ganze Zahl ist.
Frage 3: Wenn die Hash-Funktion h(x) = 2*x mod 1
ist, dann würde dies eine Gleitkommazahl im Bereich [0,1]
erzeugen. Ich kann es mit H(x) = round(h(x))
in eine ganze Zahl umwandeln. Für ein Nachrichtenbeispiel x
, wenn es in k
Blöcke von jeder Länge gleicher Länge L
aufgeteilt wird, würde ich k
solche Hash-Funktionen benötigen? Irgendwelche Vorschläge für eine Hash-Funktion für dieses Beispiel. Vielen Dank.
Vielen Dank für Ihre Antwort, aber die Dinge sind noch unklar hinsichtlich der Modulo-Operation und was ist die Tischgröße. Ich benutze Matlab und ich habe eine Datenbank von Objekten. Jedes Objekt ist ein Merkmalsvektor, ein Array der Länge L. In meiner Frage habe ich gesagt, dass jeder Vektor die Länge L hat. Also habe ich eine Matrix, wo Zeilen N die Datenobjekte (Datenpunkte) sind und ach Spalte ein Feature ist . Es gibt L solche Spalten, also ist die Array-Länge des Objekts L. Also, wäre die Tabellengröße N oder L? –
Es wäre weder! Verdrehen Sie meinen Arm, und ich sage die Größe von N für jedes Ihrer Datenobjekte, ABER der Grund, warum Sie eine Tabelle länger haben wollen, um Kollisionen mit anderen Objekten zu vermeiden. Es werden leere Räume in deinem Tisch sein, und das ist in Ordnung, so arbeiten sie! Aber die Idee ist, eine beliebige Zahl zu bekommen, wenn Sie Ihr Datenobjekt hashen, je wilder, desto besser! So zufällig wie möglich, so dass Sie den Modulo-Operator mit der Größe Ihrer Tabelle (etwa N * 2) verwenden können, so dass Sie, egal wie verrückt Ihre Nummer ist, einen Index im Bereich Ihrer Tabelle erhalten . –
Falls Sie sich über den Modulo-Operator selbst wundern, sagt '500% 11' grundsätzlich:" Dividieren Sie 500 durch 11 so oft wie möglich, und die Antwort ist, was übrig bleibt, kann nicht geteilt werden "in diesem Fall, 5. Weil '495/11 = 0', und wir haben einen Restdor von 5! Sie könnten dies also sehen, wenn Ihre Tabellenlänge 11 ist, weil es uns immer eine Zahl zwischen 0 und 10 gibt –