首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沙-1在UTF-8 Java中显示了不同的输出

沙-1在UTF-8 Java中显示了不同的输出
EN

Stack Overflow用户
提问于 2014-11-13 21:30:58
回答 1查看 871关注 0票数 0

我创建了一个Sha1函数,它的工作方式大多与PHP的sha1函数相同,并给出了相同的输出。但是当UTF-8字符出现时,它们就不同了。例如,使用字符串“hj6 6”,在PHP中,我得到"7f9d591232c5fde9f757c4d8472921517991dc3c“,而在我的Java函数中,我得到了"c963b7df20488e9ef50c1a309c1fa747ab5d8822”。以下是Java函数:

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

哪一个是正确的?我如何在Java中实现它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 22:12:14

正确的输出是7f9d591232c5fde9f757c4d8472921517991dc3c.您正在删除一个字节:

代码语言:javascript
复制
        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表格长,则摘要将不正确.

代码语言:javascript
复制
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

使用数组的长度:

代码语言:javascript
复制
        byte[] utf8 = str.getBytes(StandardCharsets.UTF_8);
        md.update(utf8, 0, utf8.length);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26918803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档