java算文件的MD5值,16进制的表示形式

本文详细介绍了如何使用Java的MessageDigest类实现MD5、SHA1、SHA-256等多种哈希算法来计算文件的摘要。通过具体示例代码展示了如何读取文件并计算其哈希值。

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

先贴以下代码:

package com.hua.md5.test;

import java.io.*;
import java.security.*;

public class HashFile {

	/**
	 * @param args
	 */
	public static char[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7',
			'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

	public static void main(String[] args) {
		String fileName = "F:\\soft\\Firefox.exe";
		String hashType = "MD5";
		try {
			System.out.println(hashType + " == " + getHash(fileName, hashType));
			hashType = "SHA1";
			System.out.println(hashType + " == " + getHash(fileName, hashType));
			hashType = "SHA-256";
			System.out.println(hashType + " == " + getHash(fileName, hashType));
			hashType = "SHA-384";
			System.out.println(hashType + " == " + getHash(fileName, hashType));
			hashType = "SHA-512";
			System.out.println(hashType + " == " + getHash(fileName, hashType));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static String getHash(String fileName, String hashType)
			throws Exception {
		InputStream fis;
		fis = new FileInputStream(fileName);
		byte[] buffer = new byte[1024];
		MessageDigest md5 = MessageDigest.getInstance(hashType);
		int numRead = 0;
		while ((numRead = fis.read(buffer)) > 0) {
			md5.update(buffer, 0, numRead);
		}
		fis.close();
		return toHexString(md5.digest());
	}

	public static String toHexString(byte[] b) {
		StringBuilder sb = new StringBuilder(b.length * 2);
		for (int i = 0; i < b.length; i++) {
			sb.append(hexChar[(b[i] & 0xf0) >>> 4]);
			sb.append(hexChar[b[i] & 0x0f]);
		}
		return sb.toString();
	}
}

 关于java的MD5算法:主要使用MessageDigest类。

public abstract class MessageDigest
extends MessageDigestSpi

  此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。

MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。

对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。

代码解析:

String fileName = "F:\\soft\\Firefox.exe";//文件的位置
		String hashType = "MD5"; //类型
		try {
			System.out.println(hashType + " == " + getHash(fileName, hashType));
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
public static String getHash(String fileName, String hashType)
			throws Exception {
		InputStream fis;
		fis = new FileInputStream(fileName);//读取文件
		byte[] buffer = new byte[1024];
		MessageDigest md5 = MessageDigest.getInstance(hashType);
		int numRead = 0;
		while ((numRead = fis.read(buffer)) > 0) {
			md5.update(buffer, 0, numRead);
		}
		fis.close();
		return toHexString(md5.digest());
	}

   getInstance()方法

 

public static MessageDigest
 getInstance
(String
 algorithm)
                                 throws NoSuchAlgorithmException
生成实现指定摘要算法的 MessageDigest 对象。如果默认的提供程序包提供所请求的摘要算法的实现,则返回包含该实现的 MessageDigest 的实例。如果默认包中不存在该算法,则搜索其他包。

 

参数:
algorithm - 所请求算法的名称。有关标准算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。
返回:
实现指定算法的 Message Digest 对象。
抛出:
NoSuchAlgorithmException - 如果算法在调用方环境中不可用。
public static MessageDigest
 getInstance
(String
 algorithm,
                                        String
 provider)
                                 throws NoSuchAlgorithmException
,
                                        NoSuchProviderException
生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。

 

参数:
algorithm - 所请求算法的名称。有关标准算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。
provider - 提供程序的名称。
返回:
实现指定算法的 Message Digest 对象。
抛出:
NoSuchAlgorithmException - 如果请求的提供程序提供的包中不存在该算法。
NoSuchProviderException - 如果提供程序在环境中不可用。
IllegalArgumentException - 如果提供程序的名称为 null 或空。

update()方法:

update

public void update
(byte input)
使用指定的字节更新摘要。

 

参数:
input - 用于更新摘要的字节。

<!-- -->

update

public void update
(byte[] input,
                   int offset,
                   int len)
使用指定的字节数组,从指定的偏移量开始更新摘要。

 

参数:
input - 字节数组。
offset - 字节数组中的偏移量,操作从此处开始。
len - 要使用的字节数,始于 offset

<!-- -->

update

public void update
(byte[] input)
使用指定的字节数组更新摘要。

 

参数:
input - 字节数组。

<!-- -->

update

public final void update
(ByteBuffer
 input)
使用指定的 ByteBuffer 更新摘要。使用始于 input.position() 处的 input.remaining() 个字节更新摘要。一旦返回,该缓冲区的位置将等于它的界限;它的界限将不会更改。

 

参数:
input - ByteBuffer
从以下版本开始:
1.5


digest

public byte[] digest
()
通过执行诸如填充之类的最终操作完成哈希计算。调用此方法后摘要被重置。

 

返回:
存放哈希值结果的字节数组。

<!-- -->

digest

public int digest
(byte[] buf,
                  int offset,
                  int len)
           throws DigestException
通过执行诸如填充之类的最终操作完成哈希计算。调用此方法后摘要被重置。

 

参数:
buf - 存放计算摘要的输出缓冲区
offset - 输出缓冲区中的偏移量,从此处开始存储摘要。
len - 在 buf 中分配给摘要的字节数
返回:
放到 buf 中的字节数
抛出:
DigestException - 如果发生错误。

<!-- -->

digest

public byte[] digest
(byte[] input)
使用指定的字节数组对摘要进行最后更新,然后完成摘要计算。也就是说,此方法首先调用 update(input) ,向 update 方法传递 input 数组,然后调用 digest()

 

参数:
input - 在完成摘要计算前要更新的输入。
返回:
存放哈希值结果的字节数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值