`
jaychang
  • 浏览: 734895 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

改进版MD5生成十六进制字符串

阅读更多
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {
	private static final char DIGITS_LOWER[] = { '0', '1', '2', '3', '4', '5',
			'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
	private static final char DIGITS_UPPER[] = { '0', '1', '2', '3', '4', '5',
			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
	private static final String DEFAULT_ENCODING = "UTF8";
	private static final String ALGORITH = "MD5";
	private static final MessageDigest md = getMessageDigest(ALGORITH);

	/**
	 * MD5(32位的十六进制表示)
	 * 
	 * @param srcStr
	 *            源字符串
	 * @param encode
	 *            编码方式
	 * @return
	 */
	public static String digest(String srcStr, String encode) {
		byte[] rstBytes;
		try {
			rstBytes = md.digest(srcStr.getBytes(encode));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		}
		return toHex(rstBytes, true);
	}

	/**
	 * 默认使用UTF8编码进行解析
	 * 
	 * @param srcStr
	 *            源字符串
	 * @return
	 */
	public static String digest(String srcStr) {
		return digest(srcStr, DEFAULT_ENCODING);
	}

	/**
	 * 获取摘要处理实例
	 * 
	 * @param algorithm
	 *            摘要的算法
	 * @return
	 */
	private static MessageDigest getMessageDigest(String algorithm) {
		try {
			return MessageDigest.getInstance(algorithm);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 字节码转十六进制的字符串
	 * 
	 * @param bytes
	 *            字节数组
	 * @param flag
	 *            大小写标志,true为小写,false为大写
	 * @return
	 */
	public static String toHex(byte[] bytes, boolean flag) {
		return new String(processBytes2Hex(bytes, flag ? DIGITS_LOWER
				: DIGITS_UPPER));
	}

	/**
	 * 将字节数组转化为十六进制字符串
	 * 
	 * @param bytes
	 *            字节数组
	 * @param digits
	 *            数字加字母字符数组
	 * @return
	 */
	private static char[] processBytes2Hex(byte[] bytes, char[] digits) {
		// bytes.length << 1肯定是32,左移1位是因为一个字节是8位二进制,一个十六进制用4位二进制表示
		// 当然可以写成l = 32,因为MD5生成的字节数组必定是长度为16的字节数组
		int l = bytes.length << 1;
		char[] rstChars = new char[l];
		int j = 0;
		for (int i = 0; i < bytes.length; i++) {
			// 得到一个字节中的高四位的值
			rstChars[j++] = digits[(0xf0 & bytes[i]) >>> 4];
			// 得到一个字节中低四位的值
			rstChars[j++] = digits[0x0f & bytes[i]];
		}
		return rstChars;
	}

	public static void main(String[] args) {
		System.out.println(MD5Util.digest("中国"));

	}

}

    可得到"中国"的MD5十六进制字符串值为“c13dceabcb143acd6c9298265d618a9f”

0
0
分享到:
评论

相关推荐

    MD5字符串加密和DES加密

    MD5字符串加密是一种广泛使用的哈希函数,全称为Message-Digest Algorithm 5,它能够将任意长度的信息转化为固定长度的128位(16字节)摘要,通常以32位的十六进制字符串表示。MD5的主要特点是快速、简单且在理想...

    MD5加密算法

    4. **固定长度输出**:无论输入数据的长度如何,MD5总是产生128位的哈希值,通常以32位的十六进制字符串形式表示。 MD5在实际中的应用主要包括: - **文件校验**:通过计算文件的MD5值,可以验证文件在传输或存储...

    JAVA_MD5加密 3个不同的版本

    - 将16字节的摘要转换为32位的十六进制字符串以方便显示和比较。 2. **MD5加强版** 加强版可能包含以下改进: - **盐值(Salt)**:在原始数据前添加一个随机的盐值,增加碰撞难度,使破解更困难。每次加密时盐值...

    MD5生成工具包.rar

    MD5,全称为Message-Digest Algorithm 5,是一种广泛使用的哈希函数,设计用于生成一个固定长度的数字摘要,通常为32位的十六进制数。这个摘要是从任意长度的输入(也被称为预映射)通过单向函数计算得出的,具有不...

    md5算法使用更新版

    它将任意长度的数据转化为一个固定长度的128位(16字节)的摘要,通常以32个十六进制字符表示。这个过程是单向的,即从数据生成摘要很容易,但反向从摘要恢复原始数据几乎不可能,这使得MD5在数据完整性校验、密码...

    common-codec-1.3

    在Commons Codec中,Hex类提供了将字节序列转换为十六进制字符串,以及将十六进制字符串还原为原始字节的函数。 3. **MD5(Message-Digest Algorithm 5)**:MD5是一种广泛使用的哈希函数,生成一个128位(16字节)...

    完整版数据摘要模块(MD5算法实现) 飞扬工作室.rar

    这个模块可能包含MD5的加密、解密、摘要计算以及与字符串的相互转换等功能,支持各种数据类型的输入,并提供高效且稳定的计算性能。 在实际应用中,用户可以通过飞扬工作室的MD5模块对文件、文本或其他数据进行哈希...

    MD5-Generator:易于使用的GUI Java md5生成器

    4. **结果展示**:将计算出的16字节二进制MD5值转换为32位的十六进制字符串,并在界面上显示给用户。 5. **错误处理**:处理可能出现的异常,如文件不存在、读取权限不足等,确保用户友好的体验。 通过MD5-...

    微博短链接算法php版本实现代码

    MD5哈希是一个128位(32个十六进制字符)的唯一标识。 2. **分段处理**:将得到的32位MD5串分成4个8字节(16个十六进制字符)的子串。 3. **位操作**:对每个8字节的子串进行处理,将其视为16进制字符串,并与0x3...

    改进哈希算法的实现。:MD5,SHA,RIPEMD的Matlab实现-matlab开发

    它将任意大小的输入转换为128位(16字节)的哈希值,通常表示为32个十六进制字符。MD5虽然在安全性上已经存在一定的弱点,容易被碰撞攻击,但在某些场景下,如文件校验,仍然有一定的应用。 SHA系列算法包括SHA-1、...

    MyFll Microsoft Visual FoxPro设计的扩展库

    MD5String 计算一个字符串的MD5效验和 CRC32File 计算一个文件的CRC32效验和 CRC32String 计算一个字符串的CRC32效验和 des 采用DES算法加密或解密一个字符串,长度为8位 des16 采用DES算法加密或解密一个...

    java代码-SHA1算法-无忧行sign

    它接受任意长度的输入(消息),通过一系列复杂的数学运算,生成一个160位(20字节)的哈希值,通常以32位的十六进制数表示。由于其高度的非线性和碰撞抗性,SHA1被视为安全的散列函数,但随着计算能力的提升,现在...

    易语言540个易模块

    改变系统菜单1.0改进版 改变系统菜单1.0简单版 改变显示器状态 高级表格到excel 高级液晶数字1.1 高级易模块集 高精度运算模块2.1版 个性信息框1.1 个性信息框1.5 个性信息框1.21 更改光标 更换桌面 工具提示 ...

    SuperNotepad

    hex(num) 十进制转十六进制 oct(num) 十进制转八进制 asc("") 返回字符的ANSI码 chr(...) 返回ANSI码映射的字符 now() 当前日期时间 date() 当前日期 time() 当前时间 timer() 自午夜后逝去的秒数 year(now...

    790个易模块打包下载-2

    改变系统菜单1.0改进版.ec 改变系统菜单1.0简单版.ec 高级表格到excel.ec 高级液晶数字1.1.ec 高级易模块集.ec 高精度运算模块2.1版.ec 个性信息框1.1.ec 个性信息框1.5.ec 个性信息框1.21.ec 更换桌面.ec ...

    790个易模块-3

    改变系统菜单1.0改进版.ec 改变系统菜单1.0简单版.ec 高级表格到excel.ec 高级液晶数字1.1.ec 高级易模块集.ec 高精度运算模块2.1版.ec 个性信息框1.1.ec 个性信息框1.5.ec 个性信息框1.21.ec 更换桌面.ec ...

    790个易模块打包

    改变系统菜单1.0改进版.ec 改变系统菜单1.0简单版.ec 高级表格到excel.ec 高级液晶数字1.1.ec 高级易模块集.ec 高精度运算模块2.1版.ec 个性信息框1.1.ec 个性信息框1.5.ec 个性信息框1.21.ec 更换桌面.ec ...

    易语言模块914个

    十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 发送消息_全选插入.ec 取CPU特征字.ec 取DOS执行结果.ec 取Excel表名列表模块1.0.ec 取IE地址栏.ec 取IP及地理位置模块...

Global site tag (gtag.js) - Google Analytics