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

Ang*_*nda 5 hash md5 scala

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

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

谢谢.

pac*_*man 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());
Run Code Online (Sandbox Code Playgroud)

让我们考虑第二行:

md.digest(inputStr.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft("") {_ + _}
Run Code Online (Sandbox Code Playgroud)
  1. md.digest(inputStr.getBytes()) ---- 从 String 中获取字节
  2. md.digest(inputStr.getBytes())。map(0xFF & _) --- 按位 & 与数组的每个项目(map 返回一个新数组)
  3. md.digest(inputStr.getBytes()).map(0xFF & )。map { "%02x".format( ) }映射每个项目的格式。
  4. md.digest(inputStr.getBytes()).map(0xFF & ).map { "%02x".format( ) }. FoldLeft("") {_ + _}这是典型的折叠,在我们的例子中从左侧开始,初始值是 "",(如果这对你来说更容易,它是 StringBuilder 在上面示例中的行为的“远”模拟)。我建议您阅读有关 scala 中的折叠、减少等操作的内容。例如https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright