我正在尝试在我正在开发的 Common Lisp 应用程序中散列一些字符串。sd-sha1 软件包似乎不受支持,并且根据 CLiki 页面判断已经有一段时间了,该页面建议使用 Ironclad。很公平,
=> (require 'ironclad)
NIL
Ironclad 不做字符串摘要。这在其项目页面上作为一种有意的设计选择进行了说明,我应该做的是将我的字符串转换为字节字符串并对其进行哈希处理。换句话说
=> (ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there"))
#(114 108 118 85 62 26 63 222 162 145 52 243 110 106 242 234 5 236 92 206)
好的,现在问题是整个练习的重点是从原始字符串输入中取出一个 sha1-hashed 字符串,这意味着我真的很想将上面的内容转换回字符串格式。但,
=> (flexi-streams:octets-to-string
(ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there"))
:external-format :utf-8)
This sequence can't be decoded using UTF-8 as it is too short.
1 octet missing at then end.
[Condition of type FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR]
Restarts:
0: [ABORT] Exit debugger, returning to top level.
另一种选择是让flexi-streams
推断正确的编码。
=> (flexi-streams:octets-to-string
(ironclad:digest-sequence
:sha1 (flexi-streams:string-to-octets "Hello there")))
"rlvU>?Þ¢4ónjòêì\\Î"
哪种有效,但我觉得结果不应该包含控制字符。根据 flexi-streams,默认编码是:latin
,所以我真的不确定现阶段该做什么。
我究竟做错了什么?如何在 Common Lisp 中获取 SHA1 消化字符串的字符串表示形式?
万一这很重要,我正在通过 Emacs+SLIME 运行 SBCL(apt-get 的版本,我相信是 1.0.29)。