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());
    }
 
}

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐