**
**
https://baike.baidu.com/item/UUID/5921266 UUID
UUID样例:
d0e75c11-51ba-4d90-b1bf-7970d37367cd(36位)
https://blog.csdn.net/qq_36264455/article/details/88579444 MD5加盐浅见
**
**
public Map generateToken(String inputPids){
String salt="20191221";
//生成推荐位的密钥16位
Map<String,String> resultMap = new HashMap<>();
for(String p:inputPids.split(",")){
String token = Md5Utils.getMdStr16(p,salt);
resultMap.put(p,token);
}
}
/**
* 获取16位md5字符串
* @param phrase 短语串
*/
public static String getMd5Str16(String phrase){
if(phrase == null){
return null;
}
MessageDigest digest;
try{
digest = MessageDigest.getInstance("md5");
}catch(NoSuchAlgorithmException e){
return null;
}
//phrase.getBytes()返回的是asci十进制的编码
//hash散列算法,返回一个十进制的byte数组
byte[] bs = digest.digest(phrase.getBytes());
String hexString = "";
for(byte b:bs){
//如果b为负数,则跟255相加得出的就是对应的十进制值(asci十进制范围是从0-255没有负值)
int temp = b & 255;
//根据temp哈希编码根据asci将编码从十进制转换成16进制
if(temp<16&&temp>=0){
//asci码0-16位是一个字符,需要补齐加0
hexString = hexString + "0" + Integer.toHexString(temp);
}else{
hexString = hexString + Integer.toHexString(temp);
}
}
return hexString.substring(8,24);
}
这个实例中把获取到的字符串是用时间戳进行的加盐,然后再通过String的getBytes()方法将获取字符串对应的编码,
相关链接:http://blog.itpub.net/28932681/viewspace-2286124/ String的getBytes()方法
https://www.jianshu.com/p/decc4dda9153 Java 自带的加密类MessageDigest类(加密MD5和SHA)
https://www.cnblogs.com/yxwkf/p/4002338.html MessageDigest加密详解
https://blog.csdn.net/u013615806/article/details/44422055/ public static String toHexString(int i)方法
https://www.cnblogs.com/shuaiding/p/11124974.html java运算符号&意思
https://blog.csdn.net/weixin_33769207/article/details/93604469 java位于运算符
https://www.jianshu.com/p/d3a03fcb7f56 MD5 16位和32位区别
https://blog.csdn.net/yueyueniaolzp/article/details/82178954
史上最全ASCII码对照表0-255(%d)
**
**
MD5将一个任意长度的数据经过编码得到一个128位(16字节)的哈希值,即为MD5值:
在这里要明确一个换算公式:
1字节=8位二进制
一个16进制=4位二进制
128/8=16=》所以上面的128位(16字节)可以解释为128个二进制等于16字节
128/4=32 这就是128个二进制转换为16进制就成了32位 所以我们看到MD5加密后的都是16进制的32位数