Scala单行从字符串生成MD5哈希

时间:2016-08-09 16:17:38

标签: scala hash md5

我是Scala的新手,我发现这个有趣的单线程从字符串生成十六进制编码的MD5哈希。我希望有人能帮助我更好地理解这一点。

private def getMd5(inputStr: String): String = {
  val md: MessageDigest = MessageDigest.getInstance("MD5")
  md.digest(inputStr.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft("") {_ + _}
}

感谢。

1 个答案:

答案 0 :(得分:2)

这只是这个java代码的模拟,但没有StringBuilder(由你决定)

    MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
    String password = "secret";
    messageDigest.update(password.getBytes());
    byte[] bytes = messageDigest.digest();
    StringBuilder stringBuilder = new StringBuilder();
    for (byte aByte : bytes) {
        stringBuilder.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1));
    }
    System.out.println(stringBuilder.toString());

让我们考虑第二行:

md.digest(inputStr.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft("") {_ + _}
  1. md.digest(inputStr.getBytes())----从String
  2. 获取字节
  3. md.digest(inputStr.getBytes())。 map(0xFF& _) ---按位&与每个数组项(map返回一个新数组)
  4. md.digest(inputStr.getBytes())。map(0xFF&amp; )。 map {“%02x”.format( )} < / strong>使用格式化每个项目的地图。
  5. md.digest(inputStr.getBytes())。map(0xFF&amp; )。map {“%02x”.format()}。 foldLeft(“”){_ + _} 它是典型的折叠,在我们的例子中从左边开始和初始值“”,(如果它对你来说更容易,它是上面例子中StringBuilder的“远”模拟)。我建议你阅读scala中的fold,reduce等操作。例如https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright