2014-02-19 23 views
6

Ich brauche Hash-Funktion. Benutzer werden diese Hashes auf den Computer schreiben, so dass der Hashwert kurz sein sollte. Ich werde etwa 50 000 000 Datensätze in der Datenbank haben. Jeder muss einen eigenen Hash haben. Ich hätte gerne einzigartige Hashes. Aber wenn ein paar Datensätze den gleichen Hash haben, kann ich akzeptieren. Einzigartig ist besser.Kürzester Hash? MD5/SHA. Erste Zeichen, Git

MD2 ist gut sicher für mich, aber Hash ist lang: "8350e5a3e24c153df2275c9f80692773" - 32 Zeichen. Wenn Sie 10 MD2-Hash auf Tastatur schreiben müssen Sie nicht glücklich ...

Git verwenden SHA1 für jeden Commit (40 Zeichen). Aber in der Ausgabe zeigen nur die ersten 7 Zeichen:

$ git log 
commit e2cfc89fae5b43594b2c649fd4c05bcc6d2d12ac 
... 
commit 56a8b4c50d4269dc3f88727472933fd81231f63b 
... 
commit ce2e9ddbe896b9592abbd5fcb6604b181809d523 
... 
commit 498c49833516ea33b6a40697634ea6e3cfd62328 
... 
commit b7d78aea415e64d8d441f9747fe6d5d48fe54ee5 

$ git log --oneline | head -n 5 
e2cfc89 commnit message... 
56a8b4c commnit message... 
ce2e9dd commnit message... 
498c498 commnit message... 
b7d78ae commnit message... 

Wie ist es sicher/einzigartig? Wenn ich zum Beispiel die ersten 5 oder 10 Zeichen von MD5/SHA-1/SHA-256 verwende, ist das sicher genug?

Vielen Dank.

Antwort

5

Standardmäßig zeigt git nur 7 Zeichen an, da die Wahrscheinlichkeit eindeutig ist. Sie können sich auf Commits/Blobs beziehen, indem Sie nur genügend Zeichen verwenden, um sie als eindeutig zu definieren.

Allerdings unter der Haube es immer noch den vollen Hash verwenden. Wenn Ihr Git-Baum zwei Commits mit den gleichen ersten 7 Zahlen hat, wird ein Fehler ausgegeben, wenn Sie nur 7 Zeichen verwenden, um eines dieser Commits zu identifizieren.

Wenn der Benutzer den Hash für Daten eingibt, die dem System bereits bekannt sind, kann der Benutzer so viele Zeichen eingeben, wie er denkt, und wenn dies nicht ausreicht, um eindeutig zu identifizieren, über welchen Hash er spricht etwa, dann Fehler und Aufforderung für mehr.

7 Hex-Zeichen gibt ~ 2x10^7 mögliche Hashes. Angenommen, Sie verwenden einen guten Hash - d. H. Es hat eine gleichmäßige Verteilung über die Werte, dann durch quadratische Annäherung haben Sie eine 50% ige Chance auf ein Duplikat nach ~ 19k * Hashes. Ob dies für Sie akzeptabel hängt davon ab, wie viele Sie einfügen

* Die Anzahl der Einsätze eine 50% ige Chance einer Hash-Kollision für einen Hash-Wert von N Hex-Zeichen zu erhalten, ist etwa 0.5+sqrt(0.25-(2xln(0.5)x16^N))

+0

Ich weiß, git nur ersten 7 Zeichen zur Vereinfachung verwenden. Verwenden Sie für die eindeutige Identifizierung immer noch den vollständigen SHA-1-Hash. Ist es sehr wahrscheinlich, dass es mehr gleiche Hashs mit den gleichen ersten 7 Zeichen gibt? – martin

+0

Vielen Dank für die Antwort. Wenn ich SHA256 Hash für "123" verwende, ist "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3". Ist es besser, die ersten 8 Zeichen zu bekommen oder zum Beispiel jedes achte Zeichen zu bekommen? Was meinst du damit? – martin

+1

Es sollte keinen Unterschied zwischen den gewählten Zeichen geben. –

6

Check out hashids, Mit diesem Tool können Sie einzigartige Hashes im YouTube-Stil aus Ihren Primärschlüsseln (oder einem anderen Satz eindeutiger Zahlen) erzeugen. Es ist nicht wirklich ein Hash in dem Sinne, dass MD5 und SHA-1 sind, da es reversibel ist.

Als Beispiel, wenn Sie Ihre Einzel integer Primärschlüssel „hash“ möchten, können Sie eine Beziehung wie

(PK: 1) <=> (hashid: 8dY0qQ) 

aus einem geheimen Wert ausgesät Dies wird erhalten, die Sie steuern, so dass die Benutzer nicht in der Lage sind um den Primärschlüssel zu ermitteln, auf den sie wirklich verweisen. Wenn Ihre Datenbank etwas komplizierter ist, sagen Sie mit mehreren Shards und komplexen Schlüsseln, sind Sie immer noch in Ordnung. hashids nimmt eine Liste von ganzen Zahlen als Eingabe:

(3, 171, 24) <=> (243j7Z) 

Als Entwickler sind Sie verantwortlich für die Festlegung der Mindest Länge des Hash. Wenn Sie mehr und mehr Hashes generieren, generiert hashids möglicherweise etwas längere Hashwerte.

Hashes sind garantiert für einen gegebenen Eingang (anfängliche Samen, Mindest Hash-Länge, und die Liste der ganzen Zahlen Hash) eindeutig sein:

Es keine Kollisionen sind. Ihre generierten Hashes sollten eindeutig sein.

gibt es Unterstützung für

  • JavaScript
  • Rubin
  • Python
  • Java
  • PHP
  • Perl
  • Coffee
  • Objective-C
  • Go
  • Lua
  • Node.js
  • .NET