【问题标题】:Hashing with ironclad and flexi-streams使用 Ironclad 和 flexi-streams 进行散列
【发布时间】:2010-10-10 14:19:21
【问题描述】:

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

【问题讨论】:

    标签: common-lisp digest ironclad


    【解决方案1】:

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

    【讨论】:

    • 伙计,在我询问相关内容之前,我必须学会阅读完整的文档。 Ironclad 页面列出了上面的实用程序函数。换句话说,我应该做的是 (ironclad:byte-array-to-hex-string (ironclad:digest-sequence :sha1 (ironclad:ascii-string-to-byte-array "Hello there"))) 而不是将 flexi-streams 引入其中(尽管如果我不处理普通的 ascii 字符串,它可能仍然有用)。感谢您为我指明正确的方向。
    • Babel 也有助于将非 ASCII 字符串编码为八位字节向量。
    猜你喜欢
    • 2023-03-13
    • 2014-06-03
    • 2015-12-14
    • 1970-01-01
    • 2018-03-13
    • 2012-06-03
    • 1970-01-01
    • 2021-06-04
    • 2011-06-28
    相关资源
    最近更新 更多