与铁定和弹性流一起散步

时间:2010-10-10 14:19:22

标签: common-lisp digest ironclad

我正在尝试在我正在使用的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)。

1 个答案:

答案 0 :(得分:9)

您从ironclad:digest-sequence 获得的八位字节是SHA1摘要。您需要一个表示这些字节的十六进制编码的字符串。 Ironclad具有内置功能:ironclad:byte-array-to-hex-string