实现将输入字符串转成唯一数字id输出--Groovy/Scala/Java
MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个 128 位固定长度的散列值。步骤(Groovy):// 第一步,获取MessageDigest对象,参数为MD5表示这是一个MD5算法md5 = MessageDigest.getInstance("MD5")// 第二步...
·
MD5,Message Digest Algorithm 5,是一种被广泛使用的信息摘要算法,可以将给定的任意长度数据通过一定的算法计算得出一个 128 位固定长度的散列值。
步骤(Groovy):
// 第一步,获取MessageDigest对象,参数为MD5表示这是一个MD5算法
md5 = MessageDigest.getInstance("MD5")
// 第二步,输入字符串数据,参数类型为byte[],所以需要转换
md5.update("byz".getBytes("UTF-8"))
md5.digest()
// 第三步,计算MD5值,并转换成128位固定长度的数字
array = md5.digest("byz".getBytes("UTF-8"))
bigInt = new BigInteger(1, array)
//==> 176054896383790039236480003885242030640
// 第四步,将128位数字转换成较短的16位字符串
resultStr = bigInt.toString(16)
//==> 8472f08ee0e742f3c2aebb2ab7389a30
注意:
第二步中,需要先获取一次(即先执行一次md5.digest())跳过第一个值,再执行第三步(不知道为什么,执行的第一次与后面值不一致),跳过该步骤获得正确值。
第三步中,digest() 方法返回值是一个字节数组类型的 16 位长度的哈希值,通常,我们会转化为十六进制的 32 位长度的字符串来使用,可以利用 BigInteger 类来做这个转化。
最终方案(Scala):
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
def getMD5(str: String): String = {
// 第一步,获取MessageDigest对象,参数为MD5表示这是一个MD5算法
val md5 = MessageDigest.getInstance("MD5")
// 第二步跳过,输入源数据,参数类型为byte[]
//md5.update("aayz".getBytes("UTF-8"))
// 第三步,计算MD5值
val array = md5.digest(str.getBytes("UTF-8"))
// 第四步,结果转换并返回
val bigInt = new BigInteger(1, array)
bigInt.toString(16)// resultStr
}
函数计算结果:
getMD5("byz")
//String = 6c51ca0a3cfbcc1a8e240946076b93e0
getMD5("byz")
//String = 6c51ca0a3cfbcc1a8e240946076b93e0
getMD5("bbyz")
//String = 8472f08ee0e742f3c2aebb2ab7389a30
getMD5("bbyz")
//String = 8472f08ee0e742f3c2aebb2ab7389a30
参考版本(Java):
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static void main(String[] args) throws NoSuchAlgorithmException{
// 第一步,获取MessageDigest对象,参数为MD5字符串,表示这是一个MD5算法
MessageDigest md5 = MessageDigest.getInstance("MD5");
// 第二步,输入源数据,参数类型为byte[]
md5.update(new byte[] {'1', '2', '3'});
// 第三步,计算MD5值
// String resultArray = md5.digest().toString();
/*
* digest() 方法返回值是一个字节数组类型的 16 位长度的哈希值,通常,我们会
* 转化为十六进制的 32 位长度的字符串来使用,可以利用 BigInteger 类来做这个转化:
*/
BigInteger bigInt = new BigInteger(1, md5.digest());
String resultStr = bigInt.toString(16);
System.out.print("123的MD5为:");
System.out.println(resultStr);
System.out.println(resultStr.length());
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)