Ich bereite im Wesentlichen Phrasen vor, die in die Datenbank aufgenommen werden sollen. Sie können fehlerhaft sein, daher möchte ich stattdessen einen kurzen Hash von ihnen speichern (ich werde einfach vergleichen, ob sie existieren oder nicht, also ist Hash ideal).
Ich gehe davon aus, dass MD5 bei mehr als 100.000 Anfragen ziemlich langsam ist, also wollte ich wissen, was die beste Methode ist, um die Phrasen zu hashen, vielleicht meine eigene Hash-Funktion einzuführen oder hash('md4', '...'
am Ende schneller zu verwenden?
Ich weiß, dass MySQL MD5 () hat, so dass dies ein wenig Geschwindigkeit auf der Abfrageseite ergänzen würde, aber vielleicht gibt es in MySQL eine schnellere Hashing-Funktion, von der ich nicht weiß, dass sie mit PHP funktionieren würde.
Antworten:
CRC32 ist ziemlich schnell und es gibt eine Funktion dafür: http://www.php.net/manual/en/function.crc32.php
Sie sollten sich jedoch bewusst sein, dass CRC32 aufgrund der reduzierten Länge (32 Bit im Vergleich zu 128 Bit bzw. 160 Bit) mehr Kollisionen als MD5- oder sogar SHA-1-Hashes aufweist. Wenn Sie jedoch nur überprüfen möchten, ob eine gespeicherte Zeichenfolge beschädigt ist, ist CRC32 in Ordnung.
quelle
Und der Code, der verwendet wird, um dies zu generieren, ist:
quelle
hash_algos()
. Der folgende Hash-Benchmarking-Code war in den PHP-Kommentaren ==> codepad.viper-7.com/5Wdhw6md5
schneller. Ein besserer Test besteht darin, den Inhalt und die Länge der Zeichenfolgen zufällig zu sortieren. Auf diese Weise erhalten wir eine bessere Vorstellung von der tatsächlichen Leistung in der realen Welt. Dadurch wird auch das Zwischenspeichern vermieden. WerfenRangliste, in der jede Schleife dasselbe zu verschlüsseln hat wie alle anderen.
Und die Ausgabe
quelle
strlen($characters)
sollte seinstrlen($characters) - 1
:)Es gibt einen Geschwindigkeitsvergleich auf der xxhash Seite. Kopieren Sie das Einfügen hier:
Es scheint also, dass xxHash bei weitem das schnellste ist, während viele andere ältere Hashes wie CRC32, MD5 und SHA schlagen.
https://code.google.com/p/xxhash/
Beachten Sie, dass dies die Reihenfolge bei einer 32-Bit-Kompilierung ist. Bei einer 64-Bit-Kompilierung ist die Leistungsreihenfolge wahrscheinlich sehr unterschiedlich. Einige der Hashes basieren stark auf 64-Bit-Multiplikationen und Abrufen.
quelle
Es scheint, dass crc32 für kleine Nachrichten (in diesem Fall 26 Zeichen) schneller ist, während md5 für längere Nachrichten (in diesem Fall> 852 Zeichen) schneller ist.
quelle
Update 2019: Diese Antwort ist die aktuellste. Bibliotheken zur Unterstützung des Murmelns sind weitgehend für alle Sprachen verfügbar.
Die aktuelle Empfehlung lautet, die Murmur Hash-Familie zu verwenden (siehe speziell die Varianten murmur2 oder murmur3 ).
Murmur-Hashes wurden für schnelles Hashing mit minimalen Kollisionen entwickelt (viel schneller als CRC, MDx und SHAx). Es ist perfekt, um nach Duplikaten zu suchen, und sehr gut für HashTable-Indizes geeignet.
Tatsächlich wird es von vielen modernen Datenbanken (Redis, ElastisSearch, Cassandra) verwendet, um alle Arten von Hashes für verschiedene Zwecke zu berechnen. Dieser spezielle Algorithmus war die Hauptursache für viele Leistungsverbesserungen im aktuellen Jahrzehnt.
Es wird auch in Implementierungen von Bloom-Filtern verwendet . Sie sollten sich bewusst sein, dass Sie bei der Suche nach "schnellen Hashes" wahrscheinlich vor einem typischen Problem stehen, das durch Bloom-Filter gelöst wird. ;-);
Hinweis : Murmeln ist ein Allzweck-Hash, dh NICHT kryptografisch. Es verhindert nicht, den Quelltext zu finden, der einen Hash generiert hat. Es ist NICHT angebracht, Passwörter zu hashen.
Noch ein paar Details: MurmurHash - was ist das?
quelle
Versuchen Sie es, anstatt anzunehmen, dass MD5 "ziemlich langsam" ist. Eine einfache C-basierte Implementierung von MD5 auf einem einfachen PC (meiner, ein 2,4-GHz-Core2 mit einem einzelnen Core) kann 6 Millionen kleine Nachrichten pro Sekunde hashen . Eine kleine Nachricht ist hier alles bis zu 55 Bytes. Bei längeren Nachrichten ist die MD5-Hashing-Geschwindigkeit linear zur Nachrichtengröße, dh, die Daten werden mit etwa 400 Megabyte pro Sekunde verarbeitet. Möglicherweise stellen Sie fest, dass dies die vierfache Höchstgeschwindigkeit einer guten Festplatte oder einer Gigabit-Ethernet-Netzwerkkarte ist.
Da mein PC über vier Kerne verfügt, bedeutet dies, dass das Hashing von Daten so schnell wie meine Festplatte höchstens 6% der verfügbaren Rechenleistung bereitstellen oder empfangen kann. Es ist eine ganz besondere Situation, bis die Hashing-Geschwindigkeit zu einem Engpass wird oder sogar spürbare Kosten auf einem PC verursacht.
Auf viel kleineren Architekturen, bei denen die Hashing-Geschwindigkeit möglicherweise etwas relevant wird, sollten Sie MD4 verwenden. MD4 ist für nicht kryptografische Zwecke in Ordnung (und für kryptografische Zwecke sollten Sie MD5 sowieso nicht verwenden). Es wurde berichtet, dass MD4 auf ARM-basierten Plattformen sogar schneller als CRC32 ist.
quelle
Vorbehalt
Die Antwort unten ist nicht die Frage zu beantworten , wie gefragt, da es nicht Hash - Funktionen nicht empfiehlt. Denken Sie daran: "Eine Hash-Funktion ist eine beliebige Funktion, mit der Daten beliebiger Größe auf Werte fester Größe abgebildet werden können." (Wikipedia) Die folgende Antwort empfiehlt Transformationen, die keine Ergebnisse mit fester Größe garantieren.
Wenn Sie bereit sind, die Anforderung der Verwendung einer Hash-Funktion zu lockern , lesen Sie weiter ...
Ursprüngliche Antwort
Ich schlage urlencode () oder base64_encode () aus folgenden Gründen vor:
Durch Anpassen des Benchmark-Codes an anderer Stelle in diesen Antworten habe ich gezeigt, dass beide viel schneller sind als jeder Hash-Algorithmus. Abhängig von Ihrer Anwendung können Sie möglicherweise urlencode () oder base64_encode () verwenden, um alle fehlerhaften Zeichenfolgen zu bereinigen, die Sie speichern möchten.
quelle
Erster Schritt: Installieren Sie libsodium (oder stellen Sie sicher, dass Sie PHP 7.2+ verwenden)
Schritt zwei: Verwenden Sie eine der folgenden Methoden:
sodium_crypto_generichash()
, Das ist BLAKE2b , eine Hash - Funktion sicherer als MD5 aber schneller als SHA256. (Link hat Benchmarks usw.)sodium_crypto_shorthash()
Dies ist SipHash-2-4 , das für Hash-Tabellen geeignet ist, für die Kollisionsbeständigkeit jedoch nicht verwendet werden sollte._shorthash
ist ungefähr dreimal so schnell wie_generichash
, aber Sie benötigen einen Schlüssel und haben ein kleines, aber realistisches Kollisionsrisiko. Mit_generichash
müssen Sie sich wahrscheinlich keine Gedanken über Kollisionen machen und keinen Schlüssel verwenden (möchten dies aber möglicherweise trotzdem).quelle
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)
- blake2b ist sicher, aber eine USERLAND PHP-Implementierung von blake2b wird viel langsamer sein als die C-implementierte sha256 für PHP ... Ich wünschte, PHP könnte blake2b in der hash_algos () SuiteWenn Sie schnell und einzigartig suchen, empfehle ich xxHash oder etwas, das den integrierten Befehl crc32c der neueren CPU verwendet, siehe https://stackoverflow.com/a/11422479/32453 . Dort wird auch auf möglicherweise noch schnellere Hashes verwiesen, wenn Sie sich nicht so sehr für die Möglichkeit einer Kollision interessieren.
quelle
Adler32 funktioniert auf meinem Computer am besten. Und
md5()
stellte sich schneller als herauscrc32()
.quelle
Die Implementierung für md5 in Hash ist etwas schneller als für md5 (). Dies kann also eine Option oder eine andere sein. Bitte versuchen Sie:
Sie können unter http://www.dozent.net/Tipps-Tricks/PHP/hash-performance sehen
quelle
CRC32 ist schneller, aber weniger sicher als MD5 und SHA1. Es gibt nicht so viele Geschwindigkeitsunterschiede zwischen MD5 und SHA1.
quelle