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

标签 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("") {_ + _}
}

谢谢。

最佳答案

它只是这个 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("") {_ + _}
  • md.digest(inputStr.getBytes()) ---- 从字符串中取出字节
  • md.digest(inputStr.getBytes())。 map (0xFF & _) --- 按位 & 与数组的每一项(映射返回一个新数组)
  • md.digest(inputStr.getBytes()).map(0xFF & )。 map { "%02x".format( ) } 映射与格式化每个项目。
  • md.digest(inputStr.getBytes()).map(0xFF & ).map { "%02x".format() }。 foldLeft("") {_ + _} 这是典型的折叠,在我们的例子中,从左开始,初始值“”,(如果对你来说更容易,它是上面例子中 StringBuilder 行为的“远”类比)。我建议您阅读 scala 中的 fold、reduce 等操作。例如https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright
  • 关于Scala 单线从字符串生成 MD5 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855843/

    相关文章:

    python - Python(或 C)中的内存高效字符串到字符串映射

    javascript - 尝试将哈希用户名存储在数据库中

    php - md5密码找回

    scala - 如何测试 Scala 宏?

    scala - Akka context.parent 意外值

    hash - 这可能是哪个哈希函数?

    ruby-on-rails - 如何从(YAML)哈希中递归删除所有具有空值的键?

    c++ - 从 libcurl 为 HTTP POST 计算 Content-MD5

    design-patterns - 静态类型检查的设计模式

    scala - 在 ScalaTest 中断言案例类