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个不同的工具类,这些工具类可能是作者根据实际开发经验...
在提供的"签名"文件中,可能包含了具体的签名工具类实现,这些类通常会封装上述签名生成和验证的逻辑,方便开发者在项目中直接调用,提高开发效率。 总的来说,接口签名是保护API安全的重要手段,MD5算法是实现签名...
一个典型的自定义图片加载工具类可能包含以下关键方法: - `loadImage(String imageUrl, ImageView imageView)`: 主要接口,传入图片URL和展示图片的ImageView,根据缓存策略加载图片。 - `getFromMemoryCache...
pine-md-0.1.2.tar.gz 是一个典型的源代码打包文件,这种格式通常包含项目的源代码、元数据以及必要的构建脚本。在Python中,这类文件通常用于开发和分发目的,开发者可以下载并解压后进行安装或进一步研究。 首先...
在C#中,`System.Security.Cryptography`命名空间提供了`MD5`类,可以生成指定数据的MD5哈希值。虽然MD5的安全性已不如从前,但在某些场景下仍然作为基础的哈希算法使用。 `公共类库.zip`可能包含了开发者自定义的...
一个典型的GUID类可能包含几个方法,分别用于获取系统时间的毫秒数(currentTimeMillis)、获取网络地址(getLocalHost)、生成随机数(nextLong),以及最重要的,生成GUID的方法(newGuid)。这样的类将多个步骤...
2. **Apache Commons Lang组件**:这是一个强大的工具包,提供了许多对Java语言功能的增强,包括字符串操作、数组处理、日期和时间转换等。在登录注册过程中,它可以帮助我们进行字符串验证、对象创建和格式化,例如...
这段代码定义了一个名为`HelloWorld`的公共类,并在`main`方法中使用`System.out.println()`语句输出“Hello, World!”的信息。这是典型的Java程序入门示例。 ##### 2.3 保存Java文件 - 在编辑完代码后,选择“文件...
5. **在运行时调用任意一个对象的成员变量和方法**:这为实现策略模式或动态调用提供了便利。 6. **在运行时处理注释**:可以读取类或方法上的注释信息。 7. **生成动态代理**:用于实现AOP(面向切面编程)等功能。...
Generator,通常指的是MyBatis Generator,这是一个代码生成工具,能够根据数据库表自动生成Java模型类、Mapper接口及XML配置文件,从而减少手动编写这些基础代码的工作量。通过配置文件,用户可以自定义生成的模板...
【描述】中的 "namegen-java" 提示这是一个基于 Java 的项目,可能包含一个或多个类,用于生成不同的名字组合。Java 是一种广泛使用的面向对象的编程语言,以其跨平台性、丰富的库和强大的社区支持而闻名。在这个...
MD5是一种广泛使用的加密散列函数,可以生成一个固定长度的唯一标识,常用于密码存储、文件校验等场景。在订餐系统中,可能用MD5对用户的密码进行加密,保护用户信息的安全。 至于其他文件,如"Unit2.dcu"、...
项目名称"Basic-Project-master"暗示这是一个基础项目的主分支,通常包含了一个典型的Android Studio项目结构,如以下几个关键部分: 1. **build.gradle**:这是项目的构建文件,定义了项目的依赖库、版本号等信息...
Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。...
2. 字符串常量池:Java中的字符串常量池是一个典型的享元模式应用,字符串常量在JVM中是被缓存的,当创建字符串常量时,如果已经存在相同的字符串,则返回池中的引用,而不是创建新的对象。 3. 线程池、连接池:这些...
- 例如,一个典型的 Elasticsearch 集群可能包含 13 个节点,支持 20+ 不同类型的索引。 - 每天新增索引数量为 20+,每个索引包含 10 个分片。 - 每天新增数据量达 1 亿条以上,每条数据的平均大小控制在 150GB ...
OpenSSL是一个强大的工具集,用于处理SSL/TLS协议以及其他与安全相关的任务。下面简要介绍如何使用OpenSSL来生成客户端和服务器端的数字证书: 1. **生成私钥**:使用`openssl genpkey`命令生成私钥。 2. **创建...
1. `proguard.cfg`:这是Android项目中用于配置ProGuard的文件,ProGuard是一个代码混淆工具,它可以减小APK大小,保护代码安全,并优化性能。 2. `.classpath`:这个文件包含了项目的类路径信息,用于构建和运行时...
这个安装包“gnu-crypto-2.1.0.tar.gz”是一个典型的Unix/Linux风格的源代码压缩包,采用gzip压缩格式,并以tar打包,便于在Linux或类Unix系统中进行编译和安装。 首先,让我们了解一下“.tar.gz”文件格式。在...
"C# 随机点名功能"是一个典型的C#编程实践,它通常用于教学或会议环境中,帮助主持人公平地选取参与者。这个小工具能够实现点名的随机性,同时提供选项来控制是否允许重复点名,以及一次可以点多少个人。 首先,...