要看你是什么编码。
如果是ASC码那么就是8位2进制一个字符,也就是两个十六进制位。
所以,你可以将这个十六进制字符串除0x以外,两位一组,每一组可以使用CHAR(0x0C)的方式转换为字符,再串加在一起就行了。
如果是UNICODE字符,那么就是4位十六进制(16位二进制)一组进行转换。
如第一个字符就是:select nchar(0x0C45),第二个字符就是select nchar(0x0000)
1、一般16位MD5就是截取32位的中间16位
2、mysql可以用SUBSTRING截取字符串
用法:substring(被截取字段,从第几位开始截取,截取长度)
例如:select SUBSTRING(md5('123456'),9,16) from dual;
49ba59abbe56e057
3、如果是密码可以用password()函数
SET old_passwords = 1;
show variables like ‘%old%';
| old_passwords | ON |
select password(‘123456′)from dual;
| 565491d704013245 |
不是数据,而是字符串。
/**利用MD5进行加密
* @param str 待加密的字符串
* @return 加密后的字符串
* @throws NoSuchAlgorithmException 没有这种产生消息摘要的算法
* @throws UnsupportedEncodingException
*/
public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{
//确定计算方法
MessageDigest md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
//加密后的字符串
String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
return newstr;
}
这里你混淆了“位”
md5的输出只有128bit一种。
32个byte,或者32个ascii可显示字符形式的是其hex码的显示形式
16个byte是其直接输出形式。
16*8=128bit
这里只要把每4bit用一个char表示,就成了32个byte的可打印显示形式。
4个bit表示从[0,1,2,3...14,15],其中[10,15]区间用[A,B,C,...F]表示即可
32位md5 可以转换 16 位 ,
但16 位无法转换成 32 位
如:
md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3
md5(admin,16) = 7a57a5a743894a0e
32位去掉前面8位 后面8位 即为 16位 md5