MD5Utils 简单计算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.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 简单计算MD5 */ 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<Character, Integer> rDigits = new HashMap<Character, Integer>(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; } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(下篇)
随着区块链概念理论的不断成熟以及强劲技术的不断深耕,区块链已经成为投资圈中备受关注的热点,从区块链1.0时代落地数字货币比特币、莱特币等,打开了区块链通向新弯道的高速路口,到区块链2.0时代开始通过智能合约来解决货币支付难题,再到3.0时代区块链尝试向各传统行业发力,标志着区块链逐渐由萌芽状态走向实际满足人们渴求状态。 互联网时代已经深入整个世界,区块链问世时,人们感受到的是另一个全新时代脚步正在靠近,春节期间引发社区热点的“三点钟无眠区块链”给了2018年开场红,区块链正要迎来它的新元年。 云栖社区特整理出1000篇关于区块链的文章分享给大家,从技术原理到应用实践,应有尽有。以下为下篇: 区块链安全如何保证?公有私有哪家强? 区块链101:什么是SegWit(隔离见证)? 区块链和中央银行 - 我们学到了什么? 感谢区块链,分权和数据安全
- 下一篇
Dependency Injection-依赖注入详解
点击关注异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 依赖注入是目前很多优秀框架都在使用的一个设计模式。Java的开发框架如Spring在用,PHP的Laravel/Phalcon/Symfony等也在用。好多不同语言的框架,设计思想大同小异,相互借鉴参考。熟悉了一个语言的开发框架,其它不同的框架甚至不同语言的开发框架,往往也很容易从设计理念和概念上理解。不过,有些语言因为设计特色,一些设计模式反而看似消失不见了。其实是融入了语言里面,不易察觉。我看见过这么一句话:“设计模式是编程语言固有缺陷的产物”。有一个讨论在这里:Why is IoC / DI not common in Python? Dependency Injection 常常简称为:DI。它是实现控制反转(Inversion of Control – IoC)的一个模式。有一本依赖注入详解的书在这里:Dependency Injection 。它的本质目的是解耦,保持软件组件之间的松散耦合,为设计开发带来灵活性。 这里借用一套PHP代码的演化过程,...
相关文章
文章评论
共有0条评论来说两句吧...