6

ProblemWarum crypto.createHash gibt unterschiedliche Ausgaben in der neuen Version zurück?

I node.js Modul haben, der crypto.createHash verwendet md5 Hash zu erzeugen.

Kürzlich bemerkte ich, dass Hash erzeugt durch crypto Modul in neuen Versionen unterscheidet:

-Code

require('crypto').createHash('md5').update('¥').digest('hex') 

Node.js v0.10.0

Ausgänge: ab3af8566ddd20d7efc9b314abe90755

Node.js V6.1.0

Ausgänge: 07625e142e4ac5961de57472657a88c1

Frage

Ich habe mich gefragt, was bewirkt, dass in der neuen Version und wie kann ich dieses Problem lösen?

aktualisieren

ähnliche Probleme auf GitHub:

Antwort

17

Einige Eingänge in Knoten v6 + einen anderen Hash als frühere Versionen Knoten berechnen.

Grundsätzlich, wenn Sie einen String in .update(), mit Knoten Versionen vor v6 die Standardcodierung binary war geben, aber für Knoten v6, der geändert utf-8.

Nehmen wir zum Beispiel diesen Code:

require('crypto').createHash('md5').update('¥').digest('hex') 

Diese gibt ab3af8566ddd20d7efc9b314abe90755 auf Knoten vorge 6 und 07625e142e4ac5961de57472657a88c1 auf Knoten 6.

Wenn Sie Knoten 6 ausgegeben werden soll die gleichen wie Pre-6-Versionen Sie haben .update() zu sagen binary Codierung zu verwenden:

require('crypto').createHash('md5').update('¥', 'binary').digest('hex') 

Oder andersrum (Node pre-6-Ausgang machen die gleiche wie 6):

require('crypto').createHash('md5').update('¥', 'utf-8').digest('hex') 
+0

Sind Diese Kodierungen (binary/utf-8) unterscheiden sich durch die in-char Byte-Reihenfolge? –

+1

@vp_arth nicht so viel Byte _order_, aber die Art, wie sie in Bytes dargestellt werden, unterscheidet sich. Ich bin der Meinung, dass 'binary' die Latin-1-Kodierung ist (die in der Anzahl der Zeichen begrenzt ist, die es darstellen kann, was meiner Meinung nach der Grund dafür war, dass der Standardwert für Knoten v6 in" utf-8 "geändert wurde). – robertklep