gpt4 book ai didi

java - SHA-1 在 UTF-8 Java 中显示不同的输出

转载 作者:行者123 更新时间:2023-12-01 12:17:20 25 4
gpt4 key购买 nike

我创建了一个 Sha1 函数,其工作方式在大多数情况下与 PHP 的 sha1 函数相同,并提供相同的输出。但当UTF-8字符出现时,它们就不同了。例如,对于字符串“hj6‐”,在 PHP 中我得到“7f9d591232c5fde9f757c4d8472921517991dc3c”,而在我的 Java 函数中我得到“c963b7df20488e9ef50c1a309c1fa747ab5d8822”。这是 Java 函数:

https://github.com/Razican/Java-Utils/blob/master/src/razican/utils/StringUtils.java#L115

哪一个是正确的?我怎样才能用Java实现它?

最佳答案

正确的输出是7f9d591232c5fde9f757c4d8472921517991dc3c。您正在丢失一个字节:

        final MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(str.getBytes("UTF-8"), 0, str.length());
sha1hash = md.digest();

上面的代码假设UTF-16字符串的长度等于UTF-8编码的字节数组的长度。如果 UTF-8 形式比 UTF-16 形式长,则摘要将不正确。

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

使用数组的长度:

        byte[] utf8 = str.getBytes(StandardCharsets.UTF_8);
md.update(utf8, 0, utf8.length);

您还可以使用md.update(str.getBytes(StandardCharsets.UTF_8))

关于java - SHA-1 在 UTF-8 Java 中显示不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26918803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com