如何计算 MD5

如果你用的 SBCL,那么 SBCL 自带了 MD5 函数库可直接使用:

CL-USER> (require :sb-md5)
("SB-MD5" "SB-ROTATE-BYTE")
CL-USER>

计算字符串的 MD5 值

CL-USER> (sb-md5:md5sum-string "123")
#(32 44 185 98 172 89 7 91 150 75 7 21 45 35 75 112)

计算文件的 MD5 值

CL-USER> (sb-md5:md5sum-file "/etc/passwd")
#(255 212 127 213 79 195 85 171 77 0 223 247 104 253 183 175)

MD5 值转成十六进制形式

遍历结果数组,用 format 函数格式化成十六进制表示即可。这里我定义了一个新函数:

(defun md5 (string)
  (with-output-to-string (stream)
    (loop for i across (sb-md5:md5sum-string string)
                                        ; 转换成 2 位的 16 进制,如果不足 2 位前面加 0
       do (format stream "~2,'0x" i))
    stream))