转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120874209
本文出自【赵彦军的博客】

文章目录

  • Hex
  • MD5Util
  • 其他实现方式
    • 方式一
    • okio 实现方式

Hex

首先定义 Hex 工具类, 来源于 apache 开源工具类 https://commons.apache.org/proper/commons-codec/download_codec.cgi

/*** @author : zhaoyanjun* @time : 2021/6/8* @desc : file md5值  https://commons.apache.org/proper/commons-codec/download_codec.cgi*/
public class Hex {/*** Used to build output as hex.*/private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd','e', 'f'};/*** Used to build output as hex.*/private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D','E', 'F'};public Hex() {// use default encoding}/*** Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order.* The returned array will be double the length of the passed array, as it takes two characters to represent any* given byte.** @param data a byte[] to convert to hex characters* @return A char[] containing lower-case hexadecimal characters* true:32位小写 718b6dd54c8d1d3ad19eb99cb12f13e2* false:32位大写 718B6DD54C8D1D3AD19EB99CB12F13E2*/public static char[] encodeHex(final byte[] data) {return encodeHex(data, true);}/*** Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order.* The returned array will be double the length of the passed array, as it takes two characters to represent any* given byte.** @param data        a byte[] to convert to Hex characters* @param toLowerCase {@code true} converts to lowercase, {@code false} to uppercase* @return A char[] containing hexadecimal characters in the selected case* @since 1.4*/public static char[] encodeHex(final byte[] data, final boolean toLowerCase) {return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);}/*** Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order.* The returned array will be double the length of the passed array, as it takes two characters to represent any* given byte.** @param data     a byte[] to convert to hex characters* @param toDigits the output alphabet (must contain at least 16 chars)* @return A char[] containing the appropriate characters from the alphabet For best results, this should be either* upper- or lower-case hex.* @since 1.4*/protected static char[] encodeHex(final byte[] data, final char[] toDigits) {final int l = data.length;final char[] out = new char[l << 1];encodeHex(data, 0, data.length, toDigits, out, 0);return out;}/*** Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order.** @param data       a byte[] to convert to hex characters* @param dataOffset the position in {@code data} to start encoding from* @param dataLen    the number of bytes from {@code dataOffset} to encode* @param toDigits   the output alphabet (must contain at least 16 chars)* @param out        a char[] which will hold the resultant appropriate characters from the alphabet.* @param outOffset  the position within {@code out} at which to start writing the encoded characters.*/private static void encodeHex(final byte[] data, final int dataOffset, final int dataLen, final char[] toDigits,final char[] out, final int outOffset) {// two characters form the hex value.for (int i = dataOffset, j = outOffset; i < dataOffset + dataLen; i++) {out[j++] = toDigits[(0xF0 & data[i]) >>> 4];out[j++] = toDigits[0x0F & data[i]];}}
}

MD5Util

import java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException/*** @author : zhaoyanjun* @time : 2021/9/17* @desc :*/
object MD5Util {/***文件Md5*/@Throws(NoSuchAlgorithmException::class, IOException::class)fun md5(file: File): String {FileInputStream(file).use { input ->return md5(input)}}/*** 字符串字符串md5*/@Throws(NoSuchAlgorithmException::class, IOException::class)fun md5(message: String): String {message.byteInputStream().use { input ->return md5(input)}}/*** 字节数组md5*/@Throws(NoSuchAlgorithmException::class, IOException::class)fun md5(byteArray: ByteArray): String {byteArray.inputStream().use { input ->return md5(input)}}/*** InputStream md5* 可处理大文件*/@Throws(NoSuchAlgorithmException::class, IOException::class)private fun md5(input: InputStream): String {val messageDigest = MessageDigest.getInstance("MD5")val buffer = ByteArray(8192)var length: Intwhile (input.read(buffer).also { length = it } != -1) {messageDigest.update(buffer, 0, length)}return String(Hex.encodeHex(messageDigest.digest()))}
}

使用

//字符串md5
val message = "今天是周三"
val md5 = MD5Util.md5(message)//文件md5
val file = File("")
val md5 = MD5Util.md5(file)//字节数组md5
val byteArray = message.toByteArray()
val md5 = MD5Util.md5(byteArray)

其他实现方式

方式一

fun getFileMD5(file: File): String? {val bufferSize = 4 * 1024var fileInputStream: FileInputStream? = nullvar digestInputStream: DigestInputStream? = nulltry {var messageDigest = MessageDigest.getInstance("MD5")fileInputStream = FileInputStream(file)digestInputStream = DigestInputStream(fileInputStream, messageDigest)val buffer = ByteArray(bufferSize)while (digestInputStream.read(buffer) > 0) messageDigest =digestInputStream.messageDigestval bigInt = BigInteger(1, messageDigest.digest())return bigInt.toString(16).padStart(32, '0')} catch (e: Exception) {return null} finally {try {digestInputStream?.close()} catch (e: Exception) {}try {fileInputStream?.close()} catch (e: Exception) {}}
}

okio 实现方式

http://blog.csdn.net/zhaoyanjun6/article/details/119997762

Java字符串、文件MD5工具类相关推荐

  1. java中的MD5工具类

    简介:MD5算法. MD5算法是典型的消息摘要算法,它是由MD4,MD3和MD2算法演变而来.. 无论是哪一种MD算法,其原理都是接受一个任意长度的消息并产生一个128位的消息摘要.. 如果把得到的消 ...

  2. java字符串差异比较工具类

    java字符串差异比较工具类 场景 比如说,前后授权对比,两个字符串的差异对比,比较前后两次字段的差异情况等等场景. 工具类 工具类源码: package com.bonc.modules.sys.c ...

  3. 分享万能java字符串编码转换工具类

    代码下载地址:http://www.zuidaima.com/share/1795356301560832.htm 原文:分享万能java字符串编码转换工具类 package com.zuidaima ...

  4. Java 字符串转码工具类

    StringConvertUtils.java package javax.utils;/*** 字符串转码工具类* * @author Logan* @createDate 2019-04-01* ...

  5. java字符串加密解密工具类

    /*** 字符串加密解密工具类** @author guyuqiang* @date 2021-06-07*/ public class StringEncryptUtil {/*** 字符串默认键值 ...

  6. java jfif_Java文件类型工具类

    package *; import java.util.HashMap; import java.util.Map; /** * * FileTypeEnum2 is 文件类型(扩展名)对比类 * * ...

  7. java万能编码转换_分享万能java字符串编码转换工具类

    package com.zuidaima.util; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public cla ...

  8. MD5工具类,提供字符串MD5加密(校验)、文件MD5值获取(校验)功能

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.Byt ...

  9. Java代码实现解压文件包和压缩文件的工具类

    最近开发任务比较多,这两天陆陆续续整理了一点资料上传一下,这个是前段时间用到的解压和压缩文件的工具类,网上找了一些,自己补充一下,现在先分享一下,希望对各位同学有所帮助! package com.as ...

最新文章

  1. docred数据集情况笔记
  2. 美国服务机器人技术路线图
  3. web.xml 里context-param 、listener、 filter、servlet 加载顺序
  4. 虚拟交换机软件_H3C交换机IRF配置介绍
  5. 非域计算机上模拟域用户,App-V如何让非域内(工作组)PC 也能享受应用程序虚拟化...
  6. centos7 离线安装自签名harbor
  7. DBA日常工作职责 - 我对DBA的七点建议
  8. php 实现类似asp.net中的datagridview效果,asp.net中使用DatagridView的增删改方法具体实现...
  9. 可曾听闻【大话】二字
  10. python查找相似图片或重复图片
  11. Mybatis事务管理机制<transactionManager>
  12. 高速公路测量计算CASIO程序全套
  13. 对象存储界的“百变星君”来了,非结构化数据存储还是事儿吗?
  14. 移动端 meta 解释
  15. Linux九阴真经之大伏魔拳残卷4 nginx(模型,安装配置,模块)
  16. 一条公链的坎坷进化路 |链捕手
  17. 如何在电脑上运行知乎?
  18. 经典唯美爱情说说语录,句句动人心弦
  19. 快播3.5不升级版常见问题
  20. 今日说“法”:FPGA的三种配置方式

热门文章

  1. android闹钟的需求分析,手机小闹钟需求分析
  2. nginx看最大并发量_Nginx高并发配置思路(轻松应对1万并发量)
  3. 【机器学习算法专题(蓄力计划)】五、机器学习中的线性代数的基础操作
  4. 寻找百度翻译参数,实现百度翻译
  5. 三十九、SPSS神器界面功能介绍,计算变量和个案计数和加权
  6. 机器学习之决策树(下)
  7. 隐马尔科夫模型 概念(上)
  8. 北京内推 | 腾讯云小微自然语言技术中心招聘NLP研究型实习生
  9. 算法全覆盖,还能玩星际争霸,开源决策智能平台OpenDILab面世
  10. linux的笔画动态加载,关于Android中GestureOverlayView多笔画的问题