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

时间:2025-03-10 07:19:22

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"));

	}
}

相关文章