我正试图找到一种散列字符串的好方法。这种方法运行良好,但结果与本网站不一致:
(defn hash-string
"Use java interop to flexibly hash strings"
[string algo base]
(let [hashed
(doto (java.security.MessageDigest/getInstance algo)
(.reset)
(.update (.getBytes string)))]
(.toString (new java.math.BigInteger 1 (.digest hashed)) base))
)
(defn hash-md5
"Generate a md5 checksum for the given string"
[string]
(hash-string string "MD5" 16)
)
当我使用这个时,我确实会得到散列。问题是,在代码出现时,我正在尝试一个编程练习,它有自己的字符串哈希示例,提供了与上面2个不同的第三个结果!
如何以人们一直期望的"标准"方式进行md5?
您的MD5操作是正确的;你只是没有正确地展示它们。
由于MD5是32个十六进制字符长,因此需要格式化字符串以正确填充。
换句话说,只需更改这个表达式:
(.toString (new java.math.BigInteger 1 (.digest hashed)) base))
到使用format
:的
(format "%032x" (new java.math.BigInteger 1 (.digest hashed)))))