2016-05-11 18 views
1

Ich habe eine Liste von ca.. 2500 Bilder. Für jedes Bild erstelle ich einen SHA1-Hash, mit dem ich jedes Bild referenzieren kann. Ich verwende auch die Hashes, um doppelte Bilder in der Liste zu finden.Angemessene SHA1 Hash-Länge für eine bestimmte Anzahl von Werten

Standardmäßig sind SHA1-Hashes 40 Zeichen lang. Momentan schneide ich die Hashes auf die ersten 7 Zeichen herunter. Ist das eine vernünftige Länge oder ist die Kollisionswahrscheinlichkeit zu hoch?

+0

Welche Wahrscheinlichkeit ist akzeptabel? – zaph

+0

bezieht sich auf alles mit abgeschnittenen * (!!) * Hashes ist ** nie ** eine gute Idee. Stattdessen sollten Sie eindeutige IDs wie aufsteigende Nummern generieren und verwenden. Alles andere wird zu Verwirrung und/oder Softwarefehlern führen. Selbst Anwendungsfälle wie Eclipse-EGIT-Commit-History-Hashes sind ... sehr fragwürdig, obwohl sie nur für Anzeigezwecke verwendet werden. – specializt

+1

Aufsteigende Zahlen liefern keine Informationen über Bilder, die identisch sind. Wie bei der Kürzung ist jedes Bit im Wesentlichen unabhängig, so dass die Kürzung die "Zufälligkeit" nicht reduziert und Routine mit größeren Hashes ausgeführt wird, wenn eine Teilmenge benötigt wird, wie etwa eine 16-Byte-IV. – zaph

Antwort

2

Welche Wahrscheinlichkeit ist akzeptabel?

Hinweis: ein SHA1-Hash ist 20-Byte, meinst du 40-Hexadezimalzeichen?

7 Hex-Zeichen wäre 7 * 4 = 28-Bit.

Aus der table, betrachten 32-Bit und 2900 Elemente die Wahrscheinlichkeit ist 0,01% für eine Kollision, die IMO nicht gut genug ist.

Warum nicht nur den vollen Hash und 20 Bytes anstelle von Hexadezimal verwenden?

+0

Ich möchte die Hashes in eine XML-Datei exportieren, also brauche ich den Hash als String. –

+0

In diesem Fall werden Sie wahrscheinlich mehr Hex-Zeichen benötigen. Wenn es viele Benutzer geben wird, müssen Sie dies berücksichtigen. – zaph