Code PHP:
Sortie PHP: P> CDF30C6B345B8E0C1DD858F92731D P> code Java: p> sortie Java: p> -51-1312107528211839-117-39-43884791- 1141229-4088-12110-12-223531-11011529 P> Je m'attendais aux deux de renvoyer le même résultat. Évidemment, ce n'est pas le cas. Comment puis-je obtenir les deux pour correspondre ou est-ce impossible? P> Edit: J'avais commis une erreur, pensez avoir la réponse à la question de toute façon. P> p> écho hachage ('SHA256', 'Jake'); CODE> P>
3 Réponses :
Eh bien, la chose tout d'abord em> que vous devez faire est d'utiliser un codage de chaîne cohérent. Je ne sais pas ce que PHP fera, mais puis persuader PHP d'utiliser UTF-8 aussi. P>
Sortiez le résultat Java dans Hex. Je doute vivement que le code que vous avez donné est le code réel que vous utilisez, comme vous l'attendez autrement, je m'attends à des produits tels que "[B @ E48E1B". Tout ce que vous faites pour convertir le tableau d'octets en une chaîne, changez-le pour utiliser HEX. P> "jake" .betbytes () code> utilisera tout ce que votre codage par défaut de la plate-forme est pour Java. C'est un vraiment mauvaise idée em>. L'utilisation de UTF-8 serait probablement un bon départ, en supposant que les copies PHP avec des chaînes Unicode pour commencer. (Si ce n'est pas le cas, vous devez déterminer ce qu'il est em> faire et essayer de faire les deux cohérents.) En Java, utilisez la surcharge de string.getbytes () < / code> qui prend un charset code> ou celui qui prend le nom d'un Charset code>. (Personnellement, j'aime utiliser Guava's CHARSETS.UTF_8 CODE>.) P>
Python a tendance à utiliser ISO-8859-1, mais tente d'adopter UNICODE, cela peut donc dépendre de la version. Pour 'Jake' code>, une chaîne All-ASCII, cela devrait céder la même chose que UTF-8. Néanmoins, j'ai chaleureusement deuxièmement l'exigence de codage de chaîne constante.
@THOMAS: YUP - Je pensais qu'il était important d'obtenir ce droit Premier i>, avant le reste ... Parce que, dès que l'OP ait vu un "fonctionnement" de Digest (par exemple, en convertissant son existant Array d'octet à hex) Ils pourraient bien décider de déclarer la victoire :)
Vous devez convertir le digest à une chaîne hexagonale avant de l'imprimer. Exemple de code peut être trouvé ici . P>
Ils imprimentent la même chose .. Convertissez votre octet [] en une chaîne hexagonale, vous verrez alors CDF30C6B345276278BEDC7BCE0C1DD858F46E0C1DD858F46EF4A231F92731D comme sortie Java, aussi:
public void testSomething() throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("jake".getBytes());
System.out.println(getHex(md.digest()));
}
static final String HEXES = "0123456789ABCDEF";
public static String getHex( byte [] raw ) {
if ( raw == null ) {
return null;
}
final StringBuilder hex = new StringBuilder( 2 * raw.length );
for ( final byte b : raw ) {
hex.append(HEXES.charAt((b & 0xF0) >> 4))
.append(HEXES.charAt((b & 0x0F)));
}
return hex.toString();
}
Vérifiez votre codage de caractères - PHP fonctionne avec des octets, Java utilise-t-elle UTF8 ou UTF16 (ou quoi)?