SHA-1 affiche une sortie différente en UTF-8 Java
J'ai créé une fonction Sha1 qui fonctionne la plupart du temps de la même manière que la fonction sha1 de PHP et donne la même sortie. Mais quand les caractères UTF-8 apparaissent, ils diffèrent. Par exemple, avec la chaîne "hj6", en PHP, j'obtiens" 7f9d591232c5fde9f757c4d8472921517991dc3c "tandis que dans ma fonction Java, j'obtiens"c963b7df20488e9ef50c1a309c1fa747ab5d8822". Voici le Java fonction:
Https://github.com/Razican/Java-Utils/blob/master/src/razican/utils/StringUtils.java#L115
Lequel est le bon? Comment puis-je l'implémenter en Java?
1 answers
La sortie correcte est 7f9d591232c5fde9f757c4d8472921517991dc3c. Vous supprimez un octet:
final MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(str.getBytes("UTF-8"), 0, str.length());
sha1hash = md.digest();
Le code ci-dessus suppose que la longueur de la chaîne UTF-16 est égale à la longueur du tableau d'octets codés UTF-8. Si le formulaire UTF-8 est plus long que le formulaire UTF-16, le résumé sera incorrect.
codepoint glyph escaped UTF-8 info
=======================================================================
U+0068 h \u0068 68, BASIC_LATIN, LOWERCASE_LETTER
U+006a j \u006a 6a, BASIC_LATIN, LOWERCASE_LETTER
U+0036 6 \u0036 36, BASIC_LATIN, DECIMAL_DIGIT_NUMBER
U+00ac ¬ \u00ac c2,ac, LATIN_1_SUPPLEMENT, MATH_SYMBOL
En utilisant la longueur du tableau:
byte[] utf8 = str.getBytes(StandardCharsets.UTF_8);
md.update(utf8, 0, utf8.length);
Vous pouvez également utiliser md.update(str.getBytes(StandardCharsets.UTF_8))