如何计算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))