package cn.sanshu.util; import java.security.MessageDigest; public class Md5Util { public static final String md5(String s) { char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try { byte[] strTemp = s.getBytes(); MessageDigest mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(strTemp); byte[] md = mdTemp.digest(); int j = md.length; char[] str = new char[j * 2]; int k = 0; for(int i = 0; i < j; ++i) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 15]; str[k++] = hexDigits[byte0 & 15]; } log.debug("newmd5:{}", new String(str)); return new String(str); } catch (Exception var10) { var10.printStackTrace(); return null; } } }
使用的时候:
32位:Md5Util.md5("aaaa"); 16位:Md5Util.md5("aaaa").substring(8, 24);
为啥16位的md5是截取32位的呢?因为:
MD5算法生成的哈希值是一个128位的二进制数字,通常表示为32位的十六进制数。每个十六进制数对应4位二进制数。
由于MD5哈希值的32位表示形式中包含了所有128位的信息,因此可以通过截取其中的一部分来得到较短的表示形式。一般来说,截取中间的16位是比较常见的做法,因为它可以提供足够的唯一性和较短的表示形式。
需要注意的是,截取哈希值的任意一部分都会减少表示形式的唯一性。因此,在实际使用中,如果需要更高的唯一性和安全性,建议使用完整的32位MD5哈希值。