(Copy-n-Paste-fähige Funktion unten)
Wie bereits erwähnt, funktioniert Folgendes.
md5(serialize($array));
Es ist jedoch erwähnenswert, dass json_encode (ironischerweise) merklich schneller arbeitet:
md5(json_encode($array));
Tatsächlich ist die Geschwindigkeitssteigerung hier zweifach, da (1) json_encode allein schneller als serialisiert ist und (2) json_encode eine kleinere Zeichenfolge erzeugt und daher weniger für md5 zu verarbeiten ist.
Bearbeiten: Hier sind Beweise, um diese Behauptung zu stützen:
<?php //this is the array I'm using -- it's multidimensional.
$array = unserialize('a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:4:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}i:3;a:6:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}i:5;a:5:{i:0;a:0:{}i:1;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}}i:2;s:5:"hello";i:3;a:2:{i:0;a:0:{}i:1;a:0:{}}i:4;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:0:{}}}}}}}}}');
//The serialize test
$b4_s = microtime(1);
for ($i=0;$i<10000;$i++) {
$serial = md5(serialize($array));
}
echo 'serialize() w/ md5() took: '.($sTime = microtime(1)-$b4_s).' sec<br/>';
//The json test
$b4_j = microtime(1);
for ($i=0;$i<10000;$i++) {
$serial = md5(json_encode($array));
}
echo 'json_encode() w/ md5() took: '.($jTime = microtime(1)-$b4_j).' sec<br/><br/>';
echo 'json_encode is <strong>'.( round(($sTime/$jTime)*100,1) ).'%</strong> faster with a difference of <strong>'.($sTime-$jTime).' seconds</strong>';
JSON_ENCODE ist durchweg über 250% (2,5x) schneller (oft über 300%) - dies ist kein trivialer Unterschied. Die Ergebnisse des Tests mit diesem Live-Skript können Sie hier sehen:
Nun ist zu beachten, dass Array (1,2,3) ein anderes MD5 als Array (3,2,1) erzeugt. Wenn dies NICHT das ist, was Sie wollen. Versuchen Sie den folgenden Code:
//Optionally make a copy of the array (if you want to preserve the original order)
$original = $array;
array_multisort($array);
$hash = md5(json_encode($array));
Bearbeiten: Es gab einige Fragen, ob das Umkehren der Reihenfolge zu den gleichen Ergebnissen führen würde. Also habe ich das hier ( richtig ) gemacht:
Wie Sie sehen können, sind die Ergebnisse genau gleich. Hier ist der ( korrigierte ) Test, der ursprünglich von jemandem erstellt wurde, der mit Drupal verwandt ist :
Und zum guten Teil, hier ist eine Funktion / Methode, die Sie kopieren und einfügen können (getestet in 5.3.3-1ubuntu9.5):
function array_md5(Array $array) {
//since we're inside a function (which uses a copied array, not
//a referenced array), you shouldn't need to copy the array
array_multisort($array);
return md5(json_encode($array));
}
serialize() w/ md5() took: 0.27773594856262 sec
json_encode() w/ md5() took: 0.34809803962708 sec
json_encode is (79.8%) faster with a difference of (-0.070362091064453 seconds)
(die Vorgängerberechnung) ist offensichtlich falsch). Mein Array ist bis zu 2 Ebenen tief. Denken Sie also daran, dass Ihre Laufleistung (wie üblich) variieren kann.quelle
Ich schließe mich einer sehr überfüllten Gruppe an, indem ich antworte, aber es gibt eine wichtige Überlegung, die keine der vorhandenen Antworten anspricht. Der Wert von
json_encode()
undserialize()
beide hängen von der Reihenfolge der Elemente im Array ab!Hier sind die Ergebnisse , wenn die Arrays nicht sortiert und sortiert werden, sondern auf zwei Arrays mit identischen Werten, die jedoch in einer anderen Reihenfolge hinzugefügt wurden (Code am Ende des Beitrags) :
Daher würden ich zwei Methoden empfehlen, um ein Array zu hashen:
Die Auswahl
json_encode()
oderserialize()
sollte durch Testen des von Ihnen verwendeten Datentyps festgelegt werden . Wenn der Code nach meinen eigenen Tests mit rein textuellen und numerischen Daten nicht tausendmal in einer engen Schleife ausgeführt wird, ist der Unterschied nicht einmal ein Benchmarking wert. Ich persönlich verwendejson_encode()
für diese Art von Daten.Hier ist der Code, der zum Generieren des obigen Sortiertests verwendet wird:
Meine schnelle Implementierung von deep_ksort () passt in diesen Fall, aber überprüfen Sie sie, bevor Sie sie für Ihre eigenen Projekte verwenden:
quelle
Die Antwort hängt stark von den Datentypen der Array-Werte ab. Für große Saiten verwenden Sie:
Verwenden Sie für kurze Zeichenfolgen und Ganzzahlen:
4 integrierte PHP-Funktionen können das Array in einen String umwandeln: serialize () , json_encode () , var_export () , print_r () .
Testergebnisse für mehrdimensionale Arrays mit md5-Hashes (32 Zeichen) in Schlüsseln und Werten:
Testergebnis für numerisches mehrdimensionales Array:
Assoziative Array -Testquelle . Numerische Array -Testquelle .
quelle
Abgesehen von Brocks hervorragender Antwort (+1) können Sie mit jeder anständigen Hashing-Bibliothek den Hash in Schritten aktualisieren, sodass Sie in der Lage sein sollten, mit jeder Zeichenfolge nacheinander zu aktualisieren, anstatt eine riesige Zeichenfolge aufzubauen.
Sehen:
hash_update
quelle
Funktioniert, aber der Hash ändert sich abhängig von der Reihenfolge des Arrays (das spielt jedoch möglicherweise keine Rolle).
quelle
Beachten Sie dies
serialize
undjson_encode
verhalten Sie sich anders, wenn es um numerische Arrays geht, bei denen die Schlüssel nicht bei 0 beginnen, oder um assoziative Arrays.json_encode
speichert solche Arrays alsObject
,json_decode
gibt also ein zurückObject
, wobeiunserialize
ein Array mit genau denselben Schlüsseln zurückgegeben wird.quelle
Ich denke, das könnte ein guter Tipp sein:
quelle
Wichtiger Hinweis zu
serialize()
Ich empfehle nicht, es als Teil der Hashing-Funktion zu verwenden, da es für die folgenden Beispiele unterschiedliche Ergebnisse zurückgeben kann. Überprüfen Sie das folgende Beispiel:
Einfaches Beispiel:
Produziert
Aber der folgende Code:
Ausgabe:
Also anstelle des zweiten Objekts PHP einfach den Link "r: 2;" zur ersten Instanz. Es ist definitiv eine gute und korrekte Methode, Daten zu serialisieren, aber es kann zu Problemen mit Ihrer Hashing-Funktion führen.
quelle
quelle
Es gibt mehrere Antworten, die sagen, dass json_code verwendet werden soll.
Aber json_encode funktioniert nicht gut mit der Zeichenfolge iso-8859-1. Sobald ein spezielles Zeichen vorhanden ist, wird die Zeichenfolge abgeschnitten.
Ich würde raten, var_export zu verwenden:
nicht so langsam wie serialize, nicht so fehlerhaft wie json_encode
quelle
Derzeit
md5(serialize($array));
funktioniert die am besten bewertete Antwort nicht gut mit Objekten.Betrachten Sie den Code:
Obwohl Arrays unterschiedlich sind (sie enthalten unterschiedliche Objekte), haben sie bei der Verwendung denselben Hash
md5(serialize($array));
. Dein Hash ist also nutzlos!Um dieses Problem zu vermeiden, können Sie Objekte
spl_object_hash()
vor der Serialisierung durch das Ergebnis von ersetzen . Sie sollten dies auch rekursiv tun, wenn Ihr Array mehrere Ebenen hat.Der folgende Code sortiert Arrays auch nach Schlüsseln, wie von dotancohen vorgeschlagen.
Jetzt können Sie verwenden
md5(serialize(replaceObjectsWithHashes($array)))
.(Beachten Sie, dass das Array in PHP vom Werttyp ist.
replaceObjectsWithHashes
Ändern Sie also NICHT das ursprüngliche Array.)quelle
Ich habe die Lösung oben nicht so leicht gesehen, deshalb wollte ich eine einfachere Antwort beitragen. Für mich bekam ich den gleichen Schlüssel, bis ich ksort (Schlüsselsortierung) verwendete:
Zuerst mit Ksort sortiert, dann sha1 mit einem json_encode ausgeführt:
Beispiel:
Ausgabe geänderter Arrays und Hashes:
quelle