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

本文探讨了JAVA中File类的hashCode()方法仅基于文件相对路径生成hash值,而文件内容的hash值则需要通过MessageDigest类读取文件内容计算。提供了使用MessageDigest计算文件hash值的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

	}
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值