r - 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 是否不以十六进制编码?
解决方案
在您的示例中,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
推荐阅读
- javascript - 在 chrome 的控制台中显示 HTMLInputElement
- javascript - refreshtoken 比 accesstoken 有什么好处?
- django - 如何在 django 的不同 div 布局中使用一个 for 循环?
- html - 有没有办法通过在数据包中读取视频来播放视频?
- proguard - 使用 proguard 混淆后没有“springfox.documentation.schema.property.ModelPropertiesProvider”类型的合格 bean
- amazon-web-services - AmazonS3Exception:您提供的 XML 格式不正确
- android - 需要在没有登录 Back4app Android 的情况下更新用户对象数据
- java - Maven Sonatype Release 不起作用:JAR 将为空 - 没有内容被标记为包含
- spring - 调用具有计算值的资源的表示是 RESTFul 吗(面向 UI,特定于客户端)
- c++ - JPEG解码中的霍夫曼:什么是符号、代码和长度