MD5 加密

package com.bra.common.utils;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {
    /**
     * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
     */
    protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    protected static MessageDigest messagedigest = null;
    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException nsaex) {
            System.err.println(MD5Util.class.getName()
                    + "初始化失败,MessageDigest不支持MD5Util。");
            nsaex.printStackTrace();
        }
    }

    /**
     * 生成字符串的md5校验值
     *
     * @param s
     * @return
     */
    public static String getMD5String(String s) {
        return getMD5String(s.getBytes());
    }

    /**
     * 生成文件的md5校验值
     *
     * @param file
     * @return
     * @throws IOException
     */
    public static String getMD5String(File file) throws IOException {
        if (!file.exists())
            return "";
        InputStream fis = new FileInputStream(file);
        String result = getMD5String(fis);
        fis.close();
        return result;
    }

    /**
     * 生成流的md5校验码
     *
     * @param in
     * @return
     * @throws IOException
     */
    public static String getMD5String(InputStream in) throws IOException {
        byte[] buffer = new byte[0x10000];
        int numRead = 0;
        while ((numRead = in.read(buffer)) > 0) {
            messagedigest.update(buffer, 0, numRead);
        }
        return bufferToHex(messagedigest.digest());
    }

    /**
     * 生成字节的md5校验码
     *
     * @param bytes
     * @return
     */
    public static String getMD5String(byte[] bytes) {
        messagedigest.update(bytes);
        return bufferToHex(messagedigest.digest());
    }

    private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }

    private static String bufferToHex(byte bytes[], int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;
        for (int l = m; l < k; l++) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }

    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>
        // 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }

    public static void main(String[] args) {
        System.out.println("md52----" + getMD5String("f00156"));
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • dubbo管理控制台

    1、在github下载dubbo源码 https://github.com/alibaba/dubbo

    week
  • Excel导出

    week
  • public、private、protected、Friendly的区别与作用域,以及不写时的区别?

    public,protected,friendly,private的访问权限如下:

    week
  • 小白刷力扣之整数反转与回文数

    题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    周萝卜
  • ​[推荐]Linux入门系列(四)系统用户账号管理(代码图文示例)

    我在前面Linux入门系列(一)说过蓝色代表文件夹;Linux入门系列(二)说过,Linux本质上就是一堆堆的文件。

    用户7656790
  • 【黄金时代】20年-我眼中的前端开发思想的变迁

    现在的前端框架越来越倾向于隐藏细节,不管是react还是vue都是这样。 说是让你更集中精力在业务逻辑,但某个东西在dom层面到底是怎么实现的?不用你用什么,前...

    web前端教室
  • 投融资汇总 | 本周(12.10-12.16)多家区块链技术公司获融资

    镁客网
  • HTTP基础知识知多少

    1.《图解HTTP》; 2.<一个http请求的详细过程> http://www.cnblogs.com/yuteng/articles/1904215.ht...

    静默加载
  • Android Studio 连接雷电模拟器 - 小米版

    其中,5555是端口,据网上说adb连接端口可以是(5555+index*2)(index=》0)即5555,5557,5559等等

    无道
  • 手把手使用numpy搭建卷积神经网络

    在每个前向传播的函数中,在参数更新时会有一个反向传播过程;此外,在前向传播过程会缓存一个参数,用于在反向传播过程中计算梯度。

    用户1631856

扫码关注云+社区

领取腾讯云代金券