我正在尝试对我正在开发的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散列处理的字符串,这意味着我真的希望将上面的内容转换回字符串格式。但,
=> (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 )。
发布于 2010-10-10 23:11:20
从ironclad:digest-sequence获得的二进制八位数是SHA1摘要。您需要一个表示这些字节的十六进制编码的字符串。Ironclad有一个内置的函数可以做到这一点:ironclad:byte-array-to-hex-string。
https://stackoverflow.com/questions/3900665
复制相似问题