Ich habe eine einfache Frage, die aufgetreten ist, als ich das Ergebnis eines SHA1-Hash in einer MySQL-Datenbank speichern wollte:
Wie lang sollte das VARCHAR- Feld sein, in dem ich das Hash-Ergebnis speichere?
mysql
database-design
hash
sha1
niklasfi
quelle
quelle
Antworten:
Ich würde
VARCHAR
für Daten mit variabler Länge verwenden, aber nicht mit Daten mit fester Länge. Da ein SHA-1-Wert immer 160 Bit lang ist,VARCHAR
würde nur ein zusätzliches Byte für die Länge des Feldes mit fester Länge verschwendet .Und ich würde auch nicht den Wert speichern, den das
SHA1
zurückgibt. Weil es nur 4 Bit pro Zeichen verwendet und somit 160/4 = 40 Zeichen benötigt. Wenn Sie jedoch 8 Bit pro Zeichen verwenden, benötigen Sie nur ein Feld mit einer Länge von 160/8 = 20 Zeichen.Daher empfehle ich Ihnen,
BINARY(20)
dieUNHEX
Funktion zu verwenden, um denSHA1
Wert in binär umzuwandeln .Ich habe die Speicheranforderungen für
BINARY(20)
und verglichenCHAR(40)
.Mit Millionen von Datensätzen
binary(20)
dauert 44,56 Millionen , währendchar(40)
64,57 Millionen dauert.InnoDB
Motor.quelle
UNHEX()
manuell zum SQL hinzufügen.Ein SHA1-Hash ist 40 Zeichen lang!
quelle
Referenz aus diesem Blog:
Unten finden Sie eine Liste der Hashing-Algorithmen sowie die erforderliche Bitgröße:
Erstellt eine Beispieltabelle mit erforderlichem CHAR (n):
quelle
Die Ausgabegröße von sha1 beträgt 160 Bit. Das sind 160/8 == 20 Zeichen (wenn Sie 8-Bit-Zeichen verwenden) oder 160/16 = 10 (wenn Sie 16-Bit-Zeichen verwenden).
quelle
Die Länge liegt also zwischen 10 16-Bit-Zeichen und 40 Hexadezimalstellen.
Entscheiden Sie in jedem Fall, welches Format Sie speichern möchten, und legen Sie basierend auf diesem Format eine feste Größe für das Feld fest. Auf diese Weise haben Sie keinen Platz verschwendet.
quelle
Möglicherweise möchten Sie VARCHAR weiterhin verwenden, wenn Sie nicht immer einen Hash für den Benutzer speichern (z. B. Authentifizierung von Konten / vergessene Anmelde-URL). Sobald ein Benutzer seine Anmeldeinformationen authentifiziert / geändert hat, sollte er den Hash nicht mehr verwenden können und sollte keinen Grund dazu haben. Sie könnten eine separate Tabelle erstellen, um temporäre Hash-> Benutzerzuordnungen zu speichern, die gelöscht werden könnten, aber ich glaube nicht, dass sich die meisten Leute die Mühe machen, dies zu tun.
quelle
Wenn Sie einen Index für die Spalte sha1 benötigen, empfehle ich aus Leistungsgründen CHAR (40). In meinem Fall ist die Spalte sha1 ein E-Mail-Bestätigungstoken. Auf der Zielseite wird die Abfrage also nur mit dem Token eingegeben. In diesem Fall ist CHAR (40) mit INDEX meiner Meinung nach die beste Wahl :)
Wenn Sie diese Methode anwenden möchten, denken Sie daran, $ raw_output = false zu belassen.
quelle