从字符串生成 MD5 哈希的 Scala 单行代码
Scala one-liner to generate MD5 Hash from string
我是 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()) ---- 从 String
中获取字节
- md.digest(inputStr.getBytes()).map(0xFF & _) --- 按位 & 数组的每一项 (map return一个新数组)
- md.digest(inputStr.getBytes()).map(0xFF & ).map { "%02x".format( ) } 映射每个项目的格式。
- md.digest(inputStr.getBytes()).map(0xFF & ).map { "%02x".format() }.foldLeft("") {_ + _} 这是典型的折叠,在我们的例子中是从左边开始,初始值为 "",(如果对你来说更容易,它是 "far" 模拟上例中 StringBuilder 的行为)。我建议您阅读 scala 中的折叠、减少等操作。例如https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright
我是 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()) ---- 从 String 中获取字节
- md.digest(inputStr.getBytes()).map(0xFF & _) --- 按位 & 数组的每一项 (map return一个新数组)
- md.digest(inputStr.getBytes()).map(0xFF & ).map { "%02x".format( ) } 映射每个项目的格式。
- md.digest(inputStr.getBytes()).map(0xFF & ).map { "%02x".format() }.foldLeft("") {_ + _} 这是典型的折叠,在我们的例子中是从左边开始,初始值为 "",(如果对你来说更容易,它是 "far" 模拟上例中 StringBuilder 的行为)。我建议您阅读 scala 中的折叠、减少等操作。例如https://coderwall.com/p/4l73-a/scala-fold-foldleft-and-foldright