首页 > 解决方案 > R 和 Java/JavaScript 中的 MD5 和 Base64 编码不匹配

问题描述

我试图在 base64 中编码一个从 R 中的 MD5 函数计算的字符串。但结果似乎与我得到的 Scala/Java/JavaScript 不同:

结果是空字符串的 Scala/Java/JavaScript:1B2M2Y8AsgTpgAmY7PhCfg==

import java.security.MessageDigest
import org.apache.commons.codec.binary.Base64

object Test extends  App {

  val empty = ""
  val md5 = MessageDigest.getInstance("MD5").digest(empty.getBytes("UTF-8"))

  val base64 = new String(Base64.encodeBase64(md5))
  println(base64)

  //Result: 1B2M2Y8AsgTpgAmY7PhCfg==

}

同样,在 JavaScript 中,请参阅https://www.npmjs.com/package/js-md5

md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==

但是在 R 中,我得到了不同的结果:ZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2U=

> library(digest)
> md5 <- digest("", algo="md5", serialize=F)
> md5 [1] "d41d8cd98f00b204e9800998ecf8427e"
> base64encode(md5) [1] "ZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2U="

我想知道 md5 是否不以十六进制编码?

标签: r

解决方案


在您的示例中,base64 编码应用于不同的对象:

  • 在 R 中,您对十六进制摘要进行编码,即字符串 ("d41d8cd98f00b204e9800998ecf8427e")
  • 在 Scala 中,您从 MD5 获得一个字节数组

在您的 Scala 代码中

scala> val md5 = MessageDigest.getInstance("MD5").digest(empty.getBytes("UTF-8"))
md5: Array[Byte] = Array(-44, 29, -116, -39, -113, 0, -78, 4, -23, -128, 9, -104, -20, -8, 66, 126)

Scala 中的 MD5 十六进制摘要与 R 中的相同:

scala> md5.map(v => f"$v%02x").mkString
res0: String = d41d8cd98f00b204e9800998ecf8427e

推荐阅读