Frage

  

Mögliche Duplizieren:
   Wie erstelle ich einen Hash-Code von einem Byte-Array in c #

In C #, ich brauche einen Hash eines Bildes zu schaffen, um sicherzustellen, dass es bei der Lagerung einzigartig ist.

Ich kann es leicht zu einem Byte-Array konvertieren, aber nicht sicher, wie von dort aus gehen.

Gibt es Klassen in .NET Framework, die mir helfen können, oder jemand bekannt einiger effizient Algorithmen wie einen eindeutigen Hash erstellen?

War es hilfreich?

Lösung

Es gibt viele Hashsummen Provider in .NET, den kryptographischen Hashes erzeugen - die Ihren Zustand satisifies, dass sie einzigartig sind (für die meisten Zwecke kollisionssicher). Sie sind alle extrem schnell und das Hashing wird auf jeden Fall nicht der Engpass in Ihrer Anwendung, wenn Sie es eine Billion mal über tun.

Persönlich Ich mag SHA1:

string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

Auch wenn die Leute man sagen Methode als eine andere langsamer sein könnte, es ist alles relativ gesehen. Ein Programm mit Bildern zu tun auf jeden Fall nicht das Mikrosekunde Prozess bemerkt einen Hashsummen zu erzeugen.

Und in Bezug auf Kollisionen, für die meisten Zwecke ist dies auch irrelevant. Selbst „veraltet“ Methoden wie MD5 sind immer noch sehr nützlich in den meisten Situationen. Nur empfehlen es nicht, wenn die Sicherheit Ihres Systems setzt auf Kollisionen zu verhindern.

Andere Tipps

Der Teil der Rex M Antwort über SHA1 mit einem Hash zu erzeugen, ist ein guter (MD5 ist auch ein beliebtes Möglichkeit). zvolkov Vorschlag über nicht ständig neuen Krypto-Anbieter schafft, ist auch ein guter (wie es der Vorschlag über CRC verwenden, wenn Geschwindigkeit wichtiger ist als praktisch garantierte Einzigartigkeit.

Allerdings tun nicht verwenden Encoding.UTF8 () .GetString ein byte [] in eine Zeichenfolge konvertieren (außer natürlich, Sie aus dem Kontext wissen, dass es gültig ist UTF8). Zum einen wird es ungültig surogates ablehnen . Verfahren garantiert Ihnen immer eine gültige Zeichenfolge aus einem byte [] ist zu konvertieren. ToBase64String () .

Erstellen von neuer Instanz von SHA1CryptoServiceProvider jedes Mal, wenn Sie einen Hash berechnen, müssen überhaupt nicht schnell. die gleiche Instanz zu verwenden ist ziemlich schnell.

Noch würde ich eher eine der vielen CRC-Algorithmen anstelle eines verschlüsselten Hash als Hash-Funktionen für Kryptographie entwickelt, nicht funktionieren gut für sehr kleine Hash-Größen (32 Bit), das ist, was Sie für Ihre GetHash wollen ( ) Überschreibung (unter der Annahme, dass das, was Sie wollen).

diesen Link Schauen Sie sich für ein Beispiel für CRC-Berechnung in C #: http: // geistige Gesundheit frei .org / 134 / standard_crc_16_in_csharp.html

P. S. der Grund, warum Sie Ihre Hash wollen klein (16 oder 32 Bit) zu sein, ist so können Sie sie schnell (das war die ganze Punkt von Hashes, erinnern Sie sich?) vergleichen. Mit Hash dargestellt durch einen 256-Bit-long-Wert als String codiert ist ziemlich verrückt in Bezug auf Leistung.

Sie können eine der Standard-Hashing-Algorithmen verwenden, aber Hashing technisch nicht Einzigartigkeit garantieren kann. Hashing ist so konzipiert, ein relativ schnelles und / oder kleines Zeichen sein, um zu sehen, ob ein Stück von Daten, die wahrscheinlich das gleiche wie die anderes ist. Es ist durchaus möglich, ganz unterschiedliche Sätze von Daten, die den gleichen Hash zu erzeugen, obwohl diese algorithmisch sehr schwer produzieren zu können.

All das beiseite, für wahrscheinlich Identitätsprüfung, MD5 ist ziemlich schnell. SHA ist zuverlässiger (MD5 gehackt wurde, so sollte nicht den Einsatz für die Sicherheit sein), aber es ist auch langsamer.

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