当前位置: 首页 > news >正文

使用 Java 获取图片的 MD5 编码

在许多应用场景中,我们需要验证文件的完整性或唯一性,常用的方法是计算文件的哈希值。MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,可以生成一个128位的哈希值(32位的十六进制数字),用于检查文件的完整性。在本文中,我们将展示如何使用 Java 计算图片文件的 MD5 编码。

什么是 MD5?

MD5 是一种加密哈希函数,用于生成文件或字符串的唯一哈希值。虽然由于碰撞问题,MD5 不再推荐用于安全相关的应用,但它仍然适用于校验文件完整性等用途。

使用 Java 计算 MD5 编码

Java 标准库中包含了 MessageDigest 类,可以用来计算文件的 MD5 值。为了简化这个过程,我们还可以使用 Apache Commons Codec 库。下面我们将展示如何使用这两种方法来计算图片文件的 MD5 编码。

使用 Java 原生方法

首先,我们来看如何使用 Java 自带的 MessageDigest 类来计算 MD5 编码:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Checksum {public static String getMD5(File file) {try (FileInputStream fis = new FileInputStream(file)) {MessageDigest md = MessageDigest.getInstance("MD5");byte[] byteArray = new byte[1024];int bytesCount = 0;while ((bytesCount = fis.read(byteArray)) != -1) {md.update(byteArray, 0, bytesCount);}byte[] bytes = md.digest();StringBuilder sb = new StringBuilder();for (byte aByte : bytes) {sb.append(String.format("%02x", aByte));}return sb.toString();} catch (NoSuchAlgorithmException | IOException e) {e.printStackTrace();return null;}}public static void main(String[] args) {File file = new File("path/to/your/image.jpg");String md5 = getMD5(file);System.out.println("MD5: " + md5);}
}

解释

  1. 导入必要的包:我们需要 java.io.File, java.io.FileInputStream, java.security.MessageDigest, 和 java.security.NoSuchAlgorithmException 这些包来处理文件和计算 MD5。
  2. 读取文件:使用 FileInputStream 读取文件内容。
  3. 计算 MD5:使用 MessageDigest 类的 update 方法来更新摘要,使用 digest 方法来计算最终的哈希值。
  4. 转换为十六进制字符串:将字节数组转换为十六进制字符串以便于阅读。

使用 Apache Commons Codec

为了使代码更简洁,我们可以使用 Apache Commons Codec 库,该库提供了更高层次的 API 来计算哈希值。首先,需要在项目中添加 Apache Commons Codec 库,可以通过 Maven 或直接下载 JAR 文件的方式添加。

Maven 依赖项:

<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version>
</dependency>

接下来,使用 Apache Commons Codec 库来计算文件的 MD5 值:

import org.apache.commons.codec.digest.DigestUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;public class MD5Checksum {public static String getMD5(File file) {try (FileInputStream fis = new FileInputStream(file)) {return DigestUtils.md5Hex(fis);} catch (IOException e) {e.printStackTrace();return null;}}public static void main(String[] args) {File file = new File("path/to/your/image.jpg");String md5 = getMD5(file);System.out.println("MD5: " + md5);}
}

解释

  1. 添加依赖:通过 Maven 或手动添加 Apache Commons Codec 库。
  2. 计算 MD5:使用 DigestUtils.md5Hex 方法直接计算文件流的 MD5 编码,简化了代码。

总结

通过这两种方法,我们可以方便地在 Java 中计算图片文件的 MD5 编码。Java 自带的 MessageDigest 类提供了底层的实现,而 Apache Commons Codec 库提供了更高层次的 API,使得代码更加简洁和易读。无论选择哪种方法,都能确保文件流在使用完毕后自动关闭,避免资源泄露。这不仅提高了代码的可靠性,也使代码更符合现代 Java 编程的最佳实践。

相关文章:

使用 Java 获取图片的 MD5 编码

在许多应用场景中&#xff0c;我们需要验证文件的完整性或唯一性&#xff0c;常用的方法是计算文件的哈希值。MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种广泛使用的哈希函数&#xff0c;可以生成一个128位的哈希值&#xff08;32位的十六进制数字&#xff0…...

GO——泛型

泛型 对于强类型语言&#xff0c;在编写代码时不事先指定类型&#xff0c;在实例化的时候作为参数指明类型 参考&#xff1a;https://www.liwenzhou.com/posts/Go/generics/ 什么时候使用泛型&#xff1f; 方法中的代码实现与类型T无关参考&#xff1a;https://juejin.cn/p…...

TSP(Python):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…...

【精通NIO】NIO介绍

一、什么是NIO NIO&#xff0c;全称为New Input/Output&#xff0c;是Java平台中用于替代传统I/O&#xff08;Blocking I/O&#xff09;模型的一个功能强大的I/O API。NIO在Java 1.4版本中被引入&#xff0c;其设计目标是提供一种非阻塞的、低延迟的I/O操作方式&#xff0c;以…...

ssh远程管理

一、Openssh概述 Openssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录、远程复制、远程文本传输。 Openssh对通信双方的数据进行了加密。有两种方式&#xff1a; 用户名和密码登录&#xff1a;比较常用密钥对认证方式&#xff1a;可以实现免密登录 ssh端口&a…...

【ai】pycharm远程ssh开发

方式1: gateway的方式是远程放一个pycharm 专业版,经常下载失败 方式2: 类似vs,源码本地,同步到远程进行运行。 参考大神的分享: Pycharm远程连接服务器(2023-11-9) Pycharm远程连接服务器(windows下远程修改服务器代码)[通俗易懂] cpolar 建议同时内网穿透 选 远程开…...

leetcode 9 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;而…...

学习Python的基础知识

目录 摘要 Python 的主要特点 基本语法 1. 变量和数据类型&#xff1a; 2. 条件语句&#xff1a; 3. 循环&#xff1a; 4. 函数&#xff1a; 5. 类和对象&#xff1a; 6. 列表和字典&#xff1a; 7. 文件I/O&#xff1a; Python 的学习路线 如何高效使用 Python 的…...

第五届上海市青少年算法竞赛网络同步赛(小学组)

第五届上海市青少年算法竞赛网络同步赛(小学组)T1. 符号译码_网络同步赛 内存限制: 256 Mb 时间限制: 1000 ms 题目描述 小爱为标点符号设计了一套编码系统,编码规则如下: [ 的编码为 010 ] 的编码为 101 < 的编码为 00 > 编码为 11 + 的编码为 011 - 编码为 100 根…...

【区分vue2和vue3下的element UI Cascader 级联选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】

在Vue 2的Element UI和Vue 3的Element Plus中&#xff0c;el-cascader&#xff08;级联选择器&#xff09;组件用于从嵌套的数据中进行选择。以下是对这两个版本下el-cascader组件的属性、事件和方法的详细介绍&#xff0c;并附带示例。 Vue 2的Element UI el-cascader 属性…...

pottery,一个超酷的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - pottery。 Github地址&#xff1a;https://github.com/brainix/pottery 在分布式系统和高并发环境中&#xff0c;Redis 作为一种高性能的键值存储数据库&#xff0c;被广泛…...

【Android面试八股文】在Java中重载和重写是什么意思,区别是什么?

文章目录 在Java中重载和重写是什么意思,区别是什么?这道题想考察什么 ?考察的知识点考生应该如何回答重载(Overloading)重写(Overriding)重载和重写的区别在Java中重载和重写是什么意思,区别是什么? 这道题想考察什么 ? Java基础 考察的知识点 面向对象多态的基…...

【第二篇】SpringSecurity源码详解

一、SpringSecurity中的核心组件 在SpringSecurity中的jar分为4个,作用分别为 jar作用spring-security-coreSpringSecurity的核心jar包,认证和授权的核心代码都在这里面spring-security-config如果使用Spring Security XML名称空间进行配置或Spring Security的Java configura…...

基于Python+FFMPEG环境下载B站歌曲

题主环境 WSL on Windows10 命令如下 # python3.9 pip install --pre yutto yutto --batch https://www.bilibili.com/video/BV168411o7Bh --audio-only ls | grep aac | xargs -I {} ffmpeg -i {} -acodec libmp3lame {}.mp3WinAmp...

静态 VxLAN 浅析及配置示例(头端复制)

一、概念&#xff1a; VxLAN&#xff1a;Visual eXtensible Local Area Network 虚拟扩展本地局域网&#xff0c;一种隧道技术&#xff0c;能在三层网络的基础上建立二层以太网网络隧道&#xff0c;从而实现跨地域的二层互连&#xff0c;VxLAN端口&#xff1a;4789EVPN&#x…...

2023年与2024年AI代理基础设施的演进:六大关键变化

随着人工智能技术的不断进步,AI代理基础设施在2023年和2024年之间经历了显著的发展和变革。本文将探讨这两年间AI代理基础设施的六大关键变化,展示如何为开发者和用户提供更加强大和集成化的解决方案。 1. 代理特定开发工具的兴起 2024年见证了专为AI代理设计的新一代开发工…...

实验三-8086指令的应用《计算机组成原理》

一、实验目的 掌握8086指令的应用 二、实验原理 三、实验仪器 计算机1台&#xff0c;emu8086软件。 四、实验步骤 1、建立00H&#xff5e;0FH&#xff5e;00H 31个数&#xff0c;00H&#xff5e;0FH数据逐渐增大,0FH&#xff5e;00H逐渐减小&#xff0c;即DI指针所表示的地…...

《维汉翻译通》App全新升级:维吾尔语短文本翻译、汉语拼音标注、维语词典、谚语格言名句等功能统统免费!还支持维吾尔文OCR识别提取文字!

2024年《维汉翻译通》App迎来重大更新&#xff01;这次升级不仅带来了全新的功能&#xff0c;还为所有用户提供了更加便捷的服务体验。以下是我们新版本的主要亮点&#xff1a; 维语短文本翻译免费啦&#xff01; 我们深知语言是沟通的桥梁&#xff0c;为了让更多人能够跨越语…...

全年申报!2024年陕西省双软企业认定条件标准、申报好处费用

1.双软企业是什么? 答:双软认证并不是一个资质,而是"软件产品登记"和"软件企业认定"两个不同资质的统称.叫做"双软企业" 2.双软企业的优惠政策是什么? 答:(1)软件产品登记的优惠政策:软件产品增值税,从13%减按3%征收,实行即征即退; (2)软件…...

系统移植 (以将Linux系统移植到S5P6818开发板为例)

&#xff08;本篇文章以将Linux系统移植到S5P6818开发板为例&#xff09; 本文章所需要的文件在下面链接获取&#xff1a;https://download.csdn.net/download/a1547998353/89406544 开发环境搭建 1、安装交叉编译工具链 安装步骤&#xff1a; 1. 在ubuntu的家目录(~)下,创建t…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...