PHP代码:
echo hash('sha256', 'jake');
PHP输出:
cdf30c6b345276278bedc7bcedd9d5582f5b8e0c1dd858f46ef4ea231f92731d
Java代码:
String s = "jake";
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(s.getBytes(Charset.forName("UTF-8")));
byte[] hashed = md.digest();
String s2 = "";
for (byte b : hashed) {
s2 += b;
}
System.out.println(s2);Java输出:
-51-1312107528211839-117-19-57-68-19-39-43884791-1141229-4088-12110-12-223531-11011529
我原以为这两个函数会返回相同的结果。显然,事实并非如此。我如何才能使两者匹配,或者这是不可能的?
编辑:我犯了一个错误,我想我现在已经有了问题的答案。
发布于 2011-01-13 21:44:17
你需要做的第一件事就是使用一致的字符串编码。我不知道PHP会做什么,但是"jake".getBytes()会使用你的平台的默认编码。这真是个坏主意。假设PHP一开始就要处理Unicode字符串,那么使用UTF-8可能是一个好的开始。(如果没有,您需要弄清楚它在做什么,并尝试使两者保持一致。)在Java语言中,使用接受Charset的String.getBytes()重载或接受Charset名称的重载。(就我个人而言,我喜欢使用芭乐的Charsets.UTF_8。)
然后说服PHP也使用UTF-8。
然后以十六进制输出Java结果。我非常怀疑您给出的代码是不是您正在运行的实际代码,否则我会期望输出"[B@e48e1b“这样的输出。无论您如何将字节数组转换为字符串,请将其更改为使用十六进制。
发布于 2011-01-13 21:50:20
他们正在打印相同的..将您的byte[]转换为十六进制字符串,然后您也会看到CDF30C6B345276278BEDC7BCEDD9D5582F5B8E0C1DD858F46EF4EA231F92731D作为Java输出:
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();
}发布于 2011-01-13 21:44:32
在打印之前,您需要将摘要转换为十六进制字符串。示例代码可以在here中找到。
https://stackoverflow.com/questions/4680661
复制相似问题