File类的hashCode()和计算文件的hash值是不同的东西。区别:
- File类的hashCode()只是计算文件的相对路径hash值。
- 计算文件的hash值是计算文件内容的hash值。
File类的hashCode()测试代码:
String filePath = "F:\\TMLab\\download_list0.txt";
File file1 = new File(filePath);
File file2 = new File(filePath);
if (() == ()) {
("Thesame file!");
}
运行结果:
"The same file!"
要计算文件本身的hash值,用MessageDigest类,需要读入文件的byte。
下面基于JDK的MessageDigest类实现了计算字符串的hash值工具类。
package ;
import ;
import ;
/**
*
* 计算字符串的hash值工具类。
*
* @author yuthzi<p>
* @version 1.0 2017年10月6日
*
*/
public class HashCodeUtil {
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f" };
/**
* 将字节数组转换为16进制的字符串
*
* @param byteArray
* 字节数组
* @return 16进制的字符串
*/
private static String byteArrayToHexString(byte[] byteArray) {
StringBuffer sb = new StringBuffer();
for (byte byt : byteArray) {
(byteToHexString(byt));
}
return ();
}
/**
* 将字节转换为16进制字符串
*
* @param byt
* 字节
* @return 16进制字符串
*/
private static String byteToHexString(byte b) {
return hexDigits[(b >> 4) & 0x0f] + hexDigits[b & 0x0f];
}
/**
* 将摘要信息转换为相应的编码
*
* @param code
* 编码类型
* @param message
* 摘要信息
* @return 相应的编码字符串
*/
private static String hash(String code, String message) {
MessageDigest md;
String encode = null;
try {
md = (code);
encode = byteArrayToHexString((()));
return encode;
} catch (NoSuchAlgorithmException e) {
();
}
return null;
}
/**
* 计算message的MD5编码
*
* @param message
* 摘要信息
* @return MD5编码之后的字符串
*/
public static String md5Hash(String message) {
return hash("MD5", message);
}
/**
* 计算message的SHA编码
*
* @param message
* 摘要信息
* @return SHA编码之后的字符串
*/
public static String shaHash(String message) {
return hash("SHA", message);
}
/**
* 计算message的SHA-256编码
*
* @param message
* 摘要信息
* @return SHA-256编码之后的字符串
*/
public static String sha256Hash(String message) {
return hash("SHA-256", message);
}
/**
* 计算message的SHA-512编码
*
* @param message
* 摘要信息
* @return SHA-512编码之后的字符串
*/
public static String sha512Hash(String message) {
return hash("SHA-512", message);
}
}
测试类:
package mytool;
import ;
public class HashCodeUtilTest
{
private static String validate(String code, String tag) {
if ((tag))
return "通过验证";
return "未通过验证";
}
public static void main(String[] args) {
// 对MD5进行验证
("----MD5----");
(validate("d41d8cd98f00b204e9800998ecf8427e", HashCodeUtil.md5Hash("")));
(validate("0cc175b9c0f1b6a831c399e269772661", HashCodeUtil.md5Hash("a")));
(validate("900150983cd24fb0d6963f7d28e17f72", HashCodeUtil.md5Hash("abc")));
(validate("f96b697d7cb7938d525a2f31aaf161d0", HashCodeUtil.md5Hash("message digest")));
(validate("c3fcd3d76192e4007dfb496cca67e13b", HashCodeUtil.md5Hash("abcdefghijklmnopqrstuvwxyz")));
(validate("d174ab98d277d9f5a5611c2c9f419d9f",
HashCodeUtil.md5Hash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")));
(validate("57edf4a22be3c955ac49da2e2107b67a",
HashCodeUtil.md5Hash("12345678901234567890123456789012345678901234567890123456789012345678901234567890")));
// 对SHA进行验证
("----SHA----");
(validate("2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
("The quick brown fox jumps over the lazy dog")));
(validate("de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3",
("The quick brown fox jumps over the lazy cog")));
(validate("da39a3ee5e6b4b0d3255bfef95601890afd80709", ("")));
("-----------");
// 对于SHA-256,SHA-512请自行验证
// 下面显示MD5 SHA SHA-256 SHA-512所生成的长度
("--MD5--:" + HashCodeUtil.md5Hash("test"));
("--SHA--:" + ("test"));
("SHA-256:" + HashCodeUtil.sha256Hash("test"));
("SHA-512:" + HashCodeUtil.sha512Hash("test"));
}
}