【问题标题】:Computing MD5 hashes in erlang在 erlang 中计算 MD5 哈希
【发布时间】:2017-01-27 12:29:14
【问题描述】:

一直在尝试用erlang写md5-digest算法,不知道怎么实现这一步,

1. creating 16 octet MD5 hash of X where X is a string.

有人可以帮忙吗?

这是不是这个意思:

Create a 16 byte(32-hex digits) of base - 8(octet) which is md5 of X. ?

谢谢!

【问题讨论】:

  • 答案是肯定的。请注意,字符串也可以表示八位字节字符串或位字符串(虽然大多数库只处理字节,但原则上位字符串也是可能的)。

标签: hash cryptography erlang hex md5


【解决方案1】:

使用crypto模块和hash函数,可以计算出MD5,这是一个16字节的摘要算法。

crypto:hash(Type, Data) -> 摘要

Type = md5

Data = iodata()

Digest = binary()

它得到一个 md5 atom 作为 Type 和一个 iodata() 作为 Data,并返回一个 binary() 作为 Digest。下面的代码 sn -p 就是一个简单的例子:

crypto:hash(md5, "put-your-string-here").

查看crypto documentation了解更多信息。

同样用于将返回的二进制值转换为十六进制字符串,标准库中没有这个功能,但它就像几行代码一样简单,在this thread中有很好的解释。

【讨论】:

  • 感谢您的回答。所以我知道它返回二进制格式,所以我创建了一个函数,它给出了这样的等效字符串表示:md5:hexstring(crypto:hash(md5, "hello"))。 “5d41402abc4b2a76b9719d911017c592”但是,我不确定 X 的 16 个八位字节 md5 哈希是什么。谢谢
  • @Atomic_alarm 我明白了。由于 erlang 返回二进制,我们应该转换为十六进制字符串。我能够使用 io_lib:format 转换为十六进制来做到这一点。但我担心的是:创建 X 的 16 个八位字节 MD5 哈希,其中 X 是一个字符串。你能解释一下这是什么意思吗?谢谢
  • @sad 没有将二进制数据类型转换为Hex字符串的函数,不过几行代码就很好解释了here
  • hexstring(<<X:128/big-unsigned-integer>>) -> lists:flatten(io_lib:format("~32.16.0b", [X])).
  • octet 视为字节的同义词。 16 个八位字节 == 16 个字节 [长度]。即 16 字节长度的哈希。 IE。 32 个字符的字符串(因为每个字节都用 2 个十六进制数字表示)
【解决方案2】:

来自 epop 包的 md5 module 计算 md5 并将其作为十六进制字符串返回。

epop_md5:string("put-your-string-here").

【讨论】:

    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 2011-12-08
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2011-08-27
    • 2012-07-12
    相关资源
    最近更新 更多