Frage

Ich habe eine einfache Frage, die auftrat, wenn ich das Ergebnis eines SHA1-Hash in einer MySQL-Datenbank speichern wollte:

Wie lange sollte die VARCHAR Feld, in dem ich das Ergebnis der Hash speichern?

War es hilfreich?

Lösung

würde ich VARCHAR für Daten mit variabler Länge verwenden, aber nicht mit Daten fester Länge. Da ein SHA-1-Wert immer 160 Bit lang, würde die VARCHAR nur verschwenden ein zusätzliches Byte für die Länge des Festlängenfeld .

Und ich würde auch den Wert der SHA1 zurückkehrt. Weil es nur 4 Bit pro Zeichen verwendet und somit würde 160/4 = 40 Zeichen benötigen. Aber wenn Sie verwenden 8 Bit pro Zeichen, würden Sie brauchen nur ein 160/8 = 20 Zeichen langes Feld.

So empfehle ich Ihnen, BINARY(20) und die UNHEX Funktion den SHA1 Wert zu konvertieren binär.

I Speicheranforderungen für BINARY(20) und CHAR(40) verglichen.

CREATE TABLE `binary` (
    `id` int unsigned auto_increment primary key,
    `password` binary(20) not null
);
CREATE TABLE `char` (
    `id` int unsigned auto_increment primary key,
    `password` char(40) not null
);

Mit Millionen von Datensätzen binary(20) 44.56M nimmt, während char(40) 64.57M nimmt. InnoDB Motor.

Andere Tipps

Ein SHA1-Hash ist 40 Zeichen lang!

Referenz aus diesem Blog wurde:

Im Folgenden finden Sie eine Liste Algorithmus von Hashing zusammen mit seiner erfordern Bitgröße:

  • MD5 = 128-Bit-Hash-Wert.
  • = SHA1 160 Bit-Hash-Wert.
  • SHA224 = 224-Bit-Hash-Wert.
  • SHA256 = 256-Bit-Hash-Wert.
  • SHA384 = 384-Bit-Hash-Wert.
  • SHA512 = 512-Bit-Hash-Wert.

Erstellt eine Beispieltabelle mit erfordern CHAR (n):

CREATE TABLE tbl_PasswordDataType
(
    ID INTEGER
    ,MD5_128_bit CHAR(32)
    ,SHA_160_bit CHAR(40)
    ,SHA_224_bit CHAR(56)
    ,SHA_256_bit CHAR(64)
    ,SHA_384_bit CHAR(96)
    ,SHA_512_bit CHAR(128)
); 
INSERT INTO tbl_PasswordDataType
VALUES 
(
    1
    ,MD5('SamplePass_WithAddedSalt')
    ,SHA1('SamplePass_WithAddedSalt')
    ,SHA2('SamplePass_WithAddedSalt',224)
    ,SHA2('SamplePass_WithAddedSalt',256)
    ,SHA2('SamplePass_WithAddedSalt',384)
    ,SHA2('SamplePass_WithAddedSalt',512)
);

Ausgabegröße von SHA1 160 Bit. Welches ist 160/8 == 20 Zeichen (wenn Sie 8-Bit-Zeichen verwenden) oder 160/16 = 10 (wenn Sie 16-Bit-Zeichen verwendet werden).

So ist die Länge zwischen 10 16-Bit-Zeichen, und 40 hexadezimalen Ziffern.

In jedem Fall entscheiden Sie das Format speichern gehen und das Feld macht eine feste Größe auf dieses Format basiert. Auf diese Weise werden Sie keine verschwendeten Speicherplatz haben.

Sie können noch wollen VARCHAR in Fällen verwenden, wo man nicht immer für den Benutzer einen Hash gespeichert werden (das heißt Konten / Zugangsdaten vergessen url Authentifizierung). Sobald ein Benutzer authentifiziert hat ihre / ihre Login-Informationen sollten sie den Hash zu verwenden und sollten keinen Grund haben, nicht in der Lage sein. Sie könnten eine eigene Tabelle erstellen temporäre Hash zu speichern. -> Benutzerverbände, die gelöscht werden könnten, aber ich glaube nicht, die meisten Leute die Mühe, dies zu tun

Wenn Sie einen Index für die SHA1-Spalte müssen, schlage ich CHAR (40) aus Leistungsgründen. In meinem Fall ist die SHA1-Spalte eine E-Mail-Bestätigung-Token, so auf der Zielseite die Abfrage nur mit dem Token eintritt. In diesem Fall CHAR (40) mit INDEX, meiner Meinung nach, ist die beste Wahl:)

Wenn Sie diese Methode zu übernehmen wollen, denken Sie daran $ raw_output = false zu verlassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top