Discuss / Java / 为啥我的SHA-1不一样

为啥我的SHA-1不一样

Topic source
MessageDigest md1 = MessageDigest.getInstance("SHA-1");
        md1.update("Hello".getBytes("UTF-8"));
        md1.update("World".getBytes("UTF-8"));
        byte[] result1 = md1.digest(); // 20 bytes: 6f44e49f848dd8ed27f73f59ab5bd4631b3f6b0d ???
        System.out.println(new BigInteger(1, result1).toString(16));

但是我输出是:db8ac1c259eb89d4a131b253bacfca5f319d54f2

哈哈

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

以你的为准

0rez-naY

#3 Created at ... [Delete] [Delete and Lock User]
new BigInteger(1, result1).toString(16) 有个大坑:0开头的,0最终会被省略

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

用String.format():

System.out.println(String.format("%040x", new BigInteger("0004e473f59ab5bd4639f848dd8ed27f1b3f6b0d", 16))); // 0004e473f59ab5bd4639f848dd8ed27f1b3f6b0d

朋友们

System.out.println(String.format("%040x", new BigInteger("0004e473f59ab5bd4639f848dd8ed27f1b3f6b0d", 16))); // 0004e473f59ab5bd4639f848dd8ed27f1b3f6b0d

这里面%040x的意思是:最小的字符数为40 ,注意这不是总数,输出可以超过此宽度,若不足则会主动补“0”。%x在String.format里面是显示十六进制整数。

你们可以将**%040x改成%099x**试试就知道了。

         System.out.println("注意看%#,#代表输出以0x开头,50是字符长度:" + String.format("%#50x", new BigInteger("0004e473f59ab5bd4639f848dd8ed27f1b3f6b0d", 16)));// 0004e473f59ab5bd4639f848dd8ed27f1b3f6b0d

刚看了看format方法,%040x,原来是格式化字符串的意思。

format(String format,object... args)  使用指定的格式字符串和参数返回格式化的字符串。


  • 1

Reply