我正在开发一个项目,作为该项目的一部分,我必须粗略地模拟比特币工作量证明计算。这涉及到在固定“BlockHash”字符串和每次迭代都会递增的 32 位 int nonce 的串联上迭代计算 SHA256 两次。如果计算出的哈希值小于“TargetHash”字符串,我们将中断循环并打印随机数值。
我试图比较两个连续的实现,一个是使用 C++ 编写的,使用 OpenSSL 的 SHA256 实现,另一个是使用 Java 编写的,使用 JDK 的内部 SHA256 实现。我原以为 OpenSSL 的实现比 JDK 快得多,但事实恰恰相反。
这是我的Java代码:
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA256 {
/**
* convert byte[] to hex string
*
* @param hash
* @return hex string
*/
private static String bytesToHex(byte[] hash) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
/**
* get a sha256 of the input string
*
* @param inputString
* @return resulting hash in hex string
*/
public static String SHA256(String inputString) {
try {
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
return bytesToHex(sha256.digest(inputString.getBytes(StandardCharsets.UTF_8)));
} catch (NoSuchAlgorithmException ex) {
System.err.println(ex.toString());
return null;
}
}
慕码人8056858
相关分类