/**
* 计算hash服务
* @param index 索引
* @param previousHash 前一个区块的hash值
* @param timestamp 时间戳
* @param data 数据
* @param nonce 难度系数
* @return 当前hash
*/
private String calculateHash(int index, String previousHash, long timestamp, String data,long nonce) {
StringBuilder builder = new StringBuilder(index);
builder.append(previousHash).append(timestamp).append(data).append(nonce);
return CryptoUtil.getSHA256(builder.toString());
}
2Java区块链中SHA-256算法的简单实现
SHA(Secure Hash Algorithm)安全散列算法,这种算法的特点是数据的少量更改会在Hash值中产生不可预知的大量更改,hash值用作表示大量数据的固定大小的唯一值,而SHA256算法的hash值大小为256位。之所以选用SHA256是因为它的大小正合适,一方面产生重复hash值的可能性很小,另一方面在区块链实际应用过程中,有可能会产生大量的区块,而使得信息量很大,那么256位的大小就比较恰当了。
java 的SHA-256工具类的实现,用jdk自带工具MessageDigest.getInstance("SHA-256");
package cn.wenwuyi.blockchain.util;
import java.security.MessageDigest;
/**
*
* 类名:CryptoUtil.java
* 描述:TODO
* 时间:2018年3月12日 下午7:06:04
* @author cn.wenwuyi
* @version 1.0
*/
public class CryptoUtil {
private CryptoUtil() {
}
public static String getSHA256(String str) {
MessageDigest messageDigest;
String encodeStr = "";
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
encodeStr = byte2Hex(messageDigest.digest());
} catch (Exception e) {
System.out.println("getSHA256 is error" + e.getMessage());
}
return encodeStr;
}
private static String byte2Hex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
String temp;
for (int i = 0; i < bytes.length; i++) {
temp = Integer.toHexString(bytes[i] & 0xFF);
if (temp.length() == 1) {
builder.append("0");
}
builder.append(temp);
}
return builder.toString();
}
}