Java 中的字符串哈希与二进制哈希
String hash vs Binary Hash in Java
我正在编写一个 Java 程序,将比特币私钥转换为 WIF 格式。
不幸的是,我弄错了 SHA256 哈希值。
我的代码是基于this tutorial的。
当我对一个值进行哈希处理时:
800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
我得到这样的结果:
e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09
而不是:
8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
这是我的一段代码:
public String getSHA(String value){
String hash = hash = DigestUtils.sha256Hex(value.getBytes());
System.out.println(hash);
return hash;
}
我使用了这个库:import org.apache.commons.codec.digest.DigestUtils;
当然是在网上搜索了这个问题,我找到了this site。
在该网站上,有两个文本框 - 字符串哈希和二进制哈希。
使用字符串散列,我得到了与 Java 程序中相同的错误结果。
但是,使用二进制哈希,我得到了正确的结果。
我的问题是:
二进制和字符串哈希有什么区别?
如何在我的 Java 方法中实现二进制哈希?
在您的例子中,800C28...
是使用十六进制编码的 byte[]
的文本表示。要将其转换回 byte[]
,您可以查看 this answer,一种方法是:
public static byte[] hexStringToByteArray(String hex) {
int l = hex.length();
byte[] data = new byte[l/2];
for (int i = 0; i < l; i += 2) {
data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
+ Character.digit(hex.charAt(i+1), 16));
}
return data;
}
String.getBytes()
将 return 字符值,例如根据 the ASCII table,字符 8
的值为 56。
System.out.println(Arrays.toString("8".getBytes())); // 56
我正在编写一个 Java 程序,将比特币私钥转换为 WIF 格式。 不幸的是,我弄错了 SHA256 哈希值。
我的代码是基于this tutorial的。
当我对一个值进行哈希处理时:
800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
我得到这样的结果:
e2e4146a36e9c455cf95a4f259f162c353cd419cc3fd0e69ae36d7d1b6cd2c09
而不是:
8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
这是我的一段代码:
public String getSHA(String value){
String hash = hash = DigestUtils.sha256Hex(value.getBytes());
System.out.println(hash);
return hash;
}
我使用了这个库:import org.apache.commons.codec.digest.DigestUtils;
当然是在网上搜索了这个问题,我找到了this site。
在该网站上,有两个文本框 - 字符串哈希和二进制哈希。 使用字符串散列,我得到了与 Java 程序中相同的错误结果。 但是,使用二进制哈希,我得到了正确的结果。
我的问题是: 二进制和字符串哈希有什么区别? 如何在我的 Java 方法中实现二进制哈希?
在您的例子中,800C28...
是使用十六进制编码的 byte[]
的文本表示。要将其转换回 byte[]
,您可以查看 this answer,一种方法是:
public static byte[] hexStringToByteArray(String hex) {
int l = hex.length();
byte[] data = new byte[l/2];
for (int i = 0; i < l; i += 2) {
data[i/2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
+ Character.digit(hex.charAt(i+1), 16));
}
return data;
}
String.getBytes()
将 return 字符值,例如根据 the ASCII table,字符 8
的值为 56。
System.out.println(Arrays.toString("8".getBytes())); // 56