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"));
}
}
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类创建文件夹与创建文件的区别
- 用java计算文件MD5(文件hash)
- 【转】Java计算文件的hash值
- Android开发--身高体重指数(BIM)计算--访问标识符号(android:id属性/XML说明文件与R.java资源文件/将字符串抽离XML/新增XML文件)
- java读取mysql数据库的blob字段和Oracle数据库的Blob字段的区别【读取properties文件】
- java中的 hashcode() 、equals() 和==的区别
- JAVA练习(计算指定目录下有多少子目录及文件)
- java快速计算文本文件行数
- C#文件操作-File类和FileInfo类有什么区别?
- 文件的读与拷贝在java程序中的区别
- java常用类解析五:IO系统File类及文件搜索工具类
- java处理加密文件---数字证书文件格式(cer和pfx)的区别
- FileHasher:递归计算指定目录的所有文件的hash值,并依据hash值寻找重复的文件(update 2006-05-22)
- java处理加密文件---数字证书文件格式(cer和pfx)的区别
- java处理加密文件---数字证书文件格式(cer和pfx)的区别
- java文件路径问题及Eclipse package,source folder,folder区别及相互转换
- Java文件Hash类,实现对计算进度的监视以及多算法的同时计算
- java文件访问File类及其过滤
- Java 利用Linux Openssl 库计算文件校验码
- 文本文件和二进制文件区别及java中字节流和字符流归纳