MD5 Erzeugt 31 Zeichen-hash in Java
Ich bin mit dem folgenden code-block zum erzeugen von MD5-hashes:
public static String encode(String data) throws Exception {
/* Check the validity of data */
if (data == null || data.isEmpty()) {
throw new IllegalArgumentException("Null value provided for "
+ "MD5 Encoding");
}
/* Get the instances for a given digest scheme MD5 or SHA */
MessageDigest m = MessageDigest.getInstance("MD5");
/* Generate the digest. Pass in the text as bytes, length to the
* bytes(offset) to be hashed; for full string pass 0 to text.length()
*/
m.update(data.getBytes(), 0, data.length());
/* Get the String representation of hash bytes, create a big integer
* out of bytes then convert it into hex value (16 as input to
* toString method)
*/
String digest = new BigInteger(1, m.digest()).toString(16);
return digest;
}
Wenn ich den oben genannten code-segment mit String-Daten als [12, B006GQIIEM, MH-ANT2000]
ist die Ausgabe eine 31-stellige hash - 268d43a823933c9dafaa4ac0e756d6a
.
Gibt es irgendwelche Probleme mit dem MD5-hash-Funktion oder es gibt ein problem in dem code oben?
Habe ich gerade gefunden hier, dass es eine
Ist Ihre Eingabe
Aber als ich versuchte, geben Sie Eingabe, wie oben, Spiel mir die Ausgabe
Ja. Klammern sind Teil der Eingabe.
Dann warum bin ich immer der 32-bit-kodierten text mit Ihrem code, wie ich oben sagte
0
am Anfang übersprungen habe. Ich habe versucht, online-MD5-generator hier und es ist auch das gleiche wie 0268d43a823933c9dafaa4ac0e756d6a
. Muss ich das Präfix ein 0
jedes mal, wenn die Länge der hash ist nicht 32?Ist Ihre Eingabe
[12, B006GQIIEM, MH-ANT2000]
?Aber als ich versuchte, geben Sie Eingabe, wie oben, Spiel mir die Ausgabe
a722cc2bf6bf1fcf579e70d4b2ce721f
32 bytes
.Ja. Klammern sind Teil der Eingabe.
Dann warum bin ich immer der 32-bit-kodierten text mit Ihrem code, wie ich oben sagte
InformationsquelleAutor divinedragon | 2012-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das einzige Problem in deinem code ist, wenn MSB ist weniger als Ox10, das Ergebnis hash-string wird nur 31 bytes, anstelle von 32 bytes, fehlt die führende null.
Erstellen Sie Ihre md5-string in dieser Art:
0
. Wenn die hash-Länge ist 31, ich muss vorangestellt ein0
. Das ist es richtig?Nein, Sie nicht haben, um zusätzliche '0'. Sie haben, um zu überprüfen jedes Zeichen Länge und anfügen von '0' an einem bestimmten Ort. '0' Hinzugefügt werden können, in der Mitte der Zeichenfolge. Sie können im code sehen, dass ich bin der überprüfung jeder string-Länge und anfügen von '0'.
Sorry, aber dein Kommentar ist irreführend, da es bezieht sich nicht auf den OP - code, sondern zu verkaufen. Er verwendet
.toString(16)
und generiert eine richtige hex-Darstellung, es wird nicht vergessen, hinzuzufügen, die Nullen in den hex-string - es nur verwirft führenden Nullen. Also die OP hätte auch mit dem Präfix so viele Nullen wie nötig um einen 32-byte-Zeichenfolge.Wie dieser code
for(byte b : digest){ sb.append(String.format("%02x", b&0xff)); }
unterscheidet sich von Ihr...? was ist besser ..?InformationsquelleAutor rizzz86
Können Sie versuchen, diese:
Hinweis: es ist
"%032x"
, nicht"%32x"
.d41d8cd98f00b204e9800998ecf8427e
.Danke. Aber ich habe es von dem Tag, als ich Sie berührte Java.
für mich funktioniert. Ich Kopier deinen code, dann ersetzt dieser Linie.
InformationsquelleAutor
Dies ist, wie ich mit MD5-hash. Berechnen Sie MD5 hash von string und return-32-byte-hexadezimal-Repräsentation.
Sehr gute Antwort, aber ich denke, das erfüllt nicht die Anforderungen des Fragestellers.
InformationsquelleAutor Yves_T
Können Sie auch versuchen, diese:
InformationsquelleAutor anTONIos