您的位置:首页 > 编程语言 > Java开发

JAVA File类的hashCode()和计算文件hash值的区别

2015-02-01 18:09 253 查看
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 (file1.hashCode() == file2.hashCode()) {
System.out.println("Thesame file!");
}

运行结果:
"The same file!"

要计算文件本身的hash值,用MessageDigest类,需要读入文件的byte。

下面基于JDK的MessageDigest类实现了计算字符串的hash值工具类。

package yuth.text;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
*
* 计算字符串的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) {
sb.append(byteToHexString(byt));
}
return sb.toString();
}

/**
* 将字节转换为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 = MessageDigest.getInstance(code);
encode = byteArrayToHexString(md.digest(message.getBytes()));

return encode;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

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 yuth.text.HashCodeUtil;

public class HashCodeUtilTest
{
private static String validate(String code, String tag) {
if (code.equals(tag))
return "通过验证";
return "未通过验证";
}

public static void main(String[] args) {

// 对MD5进行验证
System.out.println("----MD5----");
System.out.println(validate("d41d8cd98f00b204e9800998ecf8427e", HashCodeUtil.md5Hash("")));
System.out.println(validate("0cc175b9c0f1b6a831c399e269772661", HashCodeUtil.md5Hash("a")));
System.out.println(validate("900150983cd24fb0d6963f7d28e17f72", HashCodeUtil.md5Hash("abc")));
System.out.println(validate("f96b697d7cb7938d525a2f31aaf161d0", HashCodeUtil.md5Hash("message digest")));
System.out.println(validate("c3fcd3d76192e4007dfb496cca67e13b", HashCodeUtil.md5Hash("abcdefghijklmnopqrstuvwxyz")));
System.out.println(validate("d174ab98d277d9f5a5611c2c9f419d9f",
HashCodeUtil.md5Hash("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")));
System.out.println(validate("57edf4a22be3c955ac49da2e2107b67a",
HashCodeUtil.md5Hash("12345678901234567890123456789012345678901234567890123456789012345678901234567890")));

// 对SHA进行验证
System.out.println("----SHA----");
System.out.println(validate("2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
HashCodeUtil.shaHash("The quick brown fox jumps over the lazy dog")));
System.out.println(validate("de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3",
HashCodeUtil.shaHash("The quick brown fox jumps over the lazy cog")));
System.out.println(validate("da39a3ee5e6b4b0d3255bfef95601890afd80709", HashCodeUtil.shaHash("")));
System.out.println("-----------");

// 对于SHA-256,SHA-512请自行验证

// 下面显示MD5 SHA SHA-256 SHA-512所生成的长度

System.out.println("--MD5--:" + HashCodeUtil.md5Hash("test"));
System.out.println("--SHA--:" + HashCodeUtil.shaHash("test"));
System.out.println("SHA-256:" + HashCodeUtil.sha256Hash("test"));
System.out.println("SHA-512:" + HashCodeUtil.sha512Hash("test"));

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java File hashCode hash