md5 java 工具类_javamd5工具类

md5 java 工具类_javamd5工具类importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjava.util.HashMap;importjava.util.Map;importjava.util.concurrent.locks.ReentrantLock;importorg.apache.commons.l…

大家好,又见面了,我是你们的朋友全栈君。

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

//import sun.security.provider.MD5;

/**

* 简单计算MD5

*

* @author agapple 2015年3月26日 下午8:45:47

* @since 5.1.19

*/

public class MD5Utils {

private static final Log log = LogFactory.getLog(MD5Utils.class);

private static char[] digits = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’,

‘d’, ‘e’, ‘f’ };

private static Map rDigits = new HashMap(16);

static {

for (int i = 0; i < digits.length; ++i) {

rDigits.put(digits[i], i);

}

}

private static MD5Utils me = new MD5Utils();

private MessageDigest mHasher;

private ReentrantLock opLock = new ReentrantLock();

private MD5Utils(){

try {

mHasher = MessageDigest.getInstance(“md5”);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public static MD5Utils getInstance() {

return me;

}

public String getMD5String(String content) {

return bytes2string(hash(content));

}

public String getMD5String(byte[] content) {

return bytes2string(hash(content));

}

public byte[] getMD5Bytes(byte[] content) {

return hash(content);

}

/**

* 对字符串进行md5

*

* @param str

* @return md5 byte[16]

*/

public byte[] hash(String str) {

opLock.lock();

try {

byte[] bt = mHasher.digest(str.getBytes(“UTF-8”));

if (null == bt || bt.length != 16) {

throw new IllegalArgumentException(“md5 need”);

}

return bt;

} catch (UnsupportedEncodingException e) {

throw new RuntimeException(“unsupported utf-8 encoding”, e);

} finally {

opLock.unlock();

}

}

/**

* 对二进制数据进行md5

*

* @param str

* @return md5 byte[16]

*/

public byte[] hash(byte[] data) {

opLock.lock();

try {

byte[] bt = mHasher.digest(data);

if (null == bt || bt.length != 16) {

throw new IllegalArgumentException(“md5 need”);

}

return bt;

} finally {

opLock.unlock();

}

}

/**

* 将一个字节数组转化为可见的字符串

*

* @param bt

* @return

*/

public String bytes2string(byte[] bt) {

int l = bt.length;

char[] out = new char[l << 1];

for (int i = 0, j = 0; i < l; i++) {

out[j++] = digits[(0xF0 & bt[i]) >>> 4];

out[j++] = digits[0x0F & bt[i]];

}

if (log.isDebugEnabled()) {

log.debug(“[hash]” + (new String(out)));

}

return new String(out);

}

/**

* 将字符串转换为bytes

*

* @param str

* @return byte[]

*/

public byte[] string2bytes(String str) {

if (null == str) {

throw new IllegalArgumentException(“str is null”);

}

if (str.length() != 32) {

throw new IllegalArgumentException(“str.length() != 32”);

}

byte[] data = new byte[16];

char[] chs = str.toCharArray();

for (int i = 0; i < 16; ++i) {

int h = rDigits.get(chs[i * 2]).intValue();

int l = rDigits.get(chs[i * 2 + 1]).intValue();

data[i] = (byte) ((h & 0x0F) << 4 | (l & 0x0F));

}

return data;

}

}

以上代码就是用于md5的算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159015.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Mac周边环境 goBASIC语言HelloWorld

    Mac周边环境 goBASIC语言HelloWorld

  • easyui textbox 绑定oninput事件

    easyui textbox 绑定oninput事件需求:想要在一个input框输入的同时,另一个输入框的值实时变化!但是easyui只提供了onchange事件,只有当第一个输入框的光标移开时才会触发事件,不能达到实时变化的效果。于是开始各种百度,寻求easyuitextbox绑定事件的方法,但是无奈各种尝试都以失败告终!但是机智的我突然灵光一闪,心生一计,瞬间药到病除,问题迎刃而解!闲言少叙,方案走你!方案:通过easyui

  • Java二叉树前序遍历[通俗易懂]

    Java二叉树前序遍历[通俗易懂]给你二叉树的根节点root,返回它节点值的前序遍历。示例1:输入:root=[1,null,2,3]输出:[1,2,3]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]示例4:输入:root=[1,2]输出:[1,2]示例5:输入:root=[1,null,2]输出:[1,2]提示:树中节点数目在范围[0,100]内-100<=Node.val<=100进阶:递归算法很简单

  • 详解C语言中的数组指针与指针数组

    详解C语言中的数组指针与指针数组·详解数组指针与指针数组·数组指针一、区分首先我们需要了解什么是数组指针以及什么是指针数组,如下图:int*p[5];int(*p)[5];数组指针的意思即为通过指针引用数组,p先和*结合,说明了p是一个指针变量,指向一个大小为5的数组。所以,int(*p)[5]即为一个数组指针。int*p[5]则是一个大小为5且存放整型指针的数组。二、数组元素的指针1.定…

  • 生物信息通识课 – 让实验者了解生信,让生信人快速入门「建议收藏」

    生物信息通识课 – 让实验者了解生信,让生信人快速入门「建议收藏」生物信息在生物研究中应用越来越多,生物各个分支的学生和教师不可避免与生信打些交道,简单到使用在线工具查找基因的功能,在线工具做些常规分析,到设计一个高通量测序实验,从公司提供的报告中分析…

  • ubuntu完全卸载_docker安装ubuntu

    ubuntu完全卸载_docker安装ubuntudpkg-l|grepdockeraptremove–purgedockker.io

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号