`
BucketLi
  • 浏览: 195142 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

一个典型md5生成工具类

 
阅读更多
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.log4j.Logger;

/**
 * @description
 * @author <a href="junyu@taobao.com">junyu</a>
 * @date 2012-8-23上午08:53:24
 */
public class MD5 {
	private static final Logger log = Logger.getLogger(MD5.class);
    public static final String ENCODE = "UTF-8";

	private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7',
			'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
	private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(
			16);

	static {
		for (int i = 0; i < digits.length; ++i) {
			rDigits.put(digits[i], i);
		}
	}

	private static MD5 me = new MD5();
	private MessageDigest mHasher;
	private ReentrantLock opLock = new ReentrantLock();

	private MD5() {
		try {
			mHasher = MessageDigest.getInstance("md5");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public static MD5 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(MD5.ENCODE));
			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 NullPointerException("参数不能为空");
		}
		if (str.length() != 32) {
			throw new IllegalArgumentException("字符串长度必须是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;
	}
}
分享到:
评论

相关推荐

    这是一个工具类

    例如,`java.util.Arrays`就是Java标准库中的一个典型工具类,提供了对数组的各种操作,如排序、查找等。 从描述中给出的链接来看,该博客文章详细介绍了70个不同的工具类,这些工具类可能是作者根据实际开发经验...

    接口签名算法设计、MD5签名算法

    在提供的"签名"文件中,可能包含了具体的签名工具类实现,这些类通常会封装上述签名生成和验证的逻辑,方便开发者在项目中直接调用,提高开发效率。 总的来说,接口签名是保护API安全的重要手段,MD5算法是实现签名...

    自定义图片三级缓存工具类

    一个典型的自定义图片加载工具类可能包含以下关键方法: - `loadImage(String imageUrl, ImageView imageView)`: 主要接口,传入图片URL和展示图片的ImageView,根据缓存策略加载图片。 - `getFromMemoryCache...

    PyPI 官网下载 | pine-md-0.1.2.tar.gz

    pine-md-0.1.2.tar.gz 是一个典型的源代码打包文件,这种格式通常包含项目的源代码、元数据以及必要的构建脚本。在Python中,这类文件通常用于开发和分发目的,开发者可以下载并解压后进行安装或进一步研究。 首先...

    C# 常用类库

    在C#中,`System.Security.Cryptography`命名空间提供了`MD5`类,可以生成指定数据的MD5哈希值。虽然MD5的安全性已不如从前,但在某些场景下仍然作为基础的哈希算法使用。 `公共类库.zip`可能包含了开发者自定义的...

    php GUID生成函数和类

    一个典型的GUID类可能包含几个方法,分别用于获取系统时间的毫秒数(currentTimeMillis)、获取网络地址(getLocalHost)、生成随机数(nextLong),以及最重要的,生成GUID的方法(newGuid)。这样的类将多个步骤...

    Java典型模块精解:系统登录与注册

    2. **Apache Commons Lang组件**:这是一个强大的工具包,提供了许多对Java语言功能的增强,包括字符串操作、数组处理、日期和时间转换等。在登录注册过程中,它可以帮助我们进行字符串验证、对象创建和格式化,例如...

    Java零基础(JDK13)-EditPlus工具的引入.md

    这段代码定义了一个名为`HelloWorld`的公共类,并在`main`方法中使用`System.out.println()`语句输出“Hello, World!”的信息。这是典型的Java程序入门示例。 ##### 2.3 保存Java文件 - 在编辑完代码后,选择“文件...

    Reflection反射.md

    5. **在运行时调用任意一个对象的成员变量和方法**:这为实现策略模式或动态调用提供了便利。 6. **在运行时处理注释**:可以读取类或方法上的注释信息。 7. **生成动态代理**:用于实现AOP(面向切面编程)等功能。...

    springboot + mybatis + pagehelper分页插件 + druid连接池 + generator逆向插件,请阅读README.md

    Generator,通常指的是MyBatis Generator,这是一个代码生成工具,能够根据数据库表自动生成Java模型类、Mapper接口及XML配置文件,从而减少手动编写这些基础代码的工作量。通过配置文件,用户可以自定义生成的模板...

    namegen-java:用 Java 编写的名称生成器

    【描述】中的 "namegen-java" 提示这是一个基于 Java 的项目,可能包含一个或多个类,用于生成不同的名字组合。Java 是一种广泛使用的面向对象的编程语言,以其跨平台性、丰富的库和强大的社区支持而闻名。在这个...

    Delphi 用HTML做界面。订餐系统。跟js/html交互

    MD5是一种广泛使用的加密散列函数,可以生成一个固定长度的唯一标识,常用于密码存储、文件校验等场景。在订餐系统中,可能用MD5对用户的密码进行加密,保护用户信息的安全。 至于其他文件,如"Unit2.dcu"、...

    Android-一个Android基础项目方便您快速进行开发

    项目名称"Basic-Project-master"暗示这是一个基础项目的主分支,通常包含了一个典型的Android Studio项目结构,如以下几个关键部分: 1. **build.gradle**:这是项目的构建文件,定义了项目的依赖库、版本号等信息...

    JAVA上百实例源码以及开源项目源代码

    Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。...

    设计模式_结构型_享元模式.md

    2. 字符串常量池:Java中的字符串常量池是一个典型的享元模式应用,字符串常量在JVM中是被缓存的,当创建字符串常量时,如果已经存在相同的字符串,则返回池中的引用,而不是创建新的对象。 3. 线程池、连接池:这些...

    Elasticsearch最新2021年面试题附答案解析,大汇总.md

    - 例如,一个典型的 Elasticsearch 集群可能包含 13 个节点,支持 20+ 不同类型的索引。 - 每天新增索引数量为 20+,每个索引包含 10 个分片。 - 每天新增数据量达 1 亿条以上,每条数据的平均大小控制在 150GB ...

    Openssl与数字证书

    OpenSSL是一个强大的工具集,用于处理SSL/TLS协议以及其他与安全相关的任务。下面简要介绍如何使用OpenSSL来生成客户端和服务器端的数字证书: 1. **生成私钥**:使用`openssl genpkey`命令生成私钥。 2. **创建...

    Android 仿iphone 气泡短信 DEMO源码.rar

    1. `proguard.cfg`:这是Android项目中用于配置ProGuard的文件,ProGuard是一个代码混淆工具,它可以减小APK大小,保护代码安全,并优化性能。 2. `.classpath`:这个文件包含了项目的类路径信息,用于构建和运行时...

    gnu-crypto-2.1.0.tar.gz

    这个安装包“gnu-crypto-2.1.0.tar.gz”是一个典型的Unix/Linux风格的源代码压缩包,采用gzip压缩格式,并以tar打包,便于在Linux或类Unix系统中进行编译和安装。 首先,让我们了解一下“.tar.gz”文件格式。在...

    C# 随机点名功能

    "C# 随机点名功能"是一个典型的C#编程实践,它通常用于教学或会议环境中,帮助主持人公平地选取参与者。这个小工具能够实现点名的随机性,同时提供选项来控制是否允许重复点名,以及一次可以点多少个人。 首先,...

Global site tag (gtag.js) - Google Analytics