gpt4 book ai didi

common-lisp - 使用 Ironclad 和 Flexi-stream 进行哈希处理

转载 作者:行者123 更新时间:2023-12-02 07:37:35 25 4
gpt4 key购买 nike

我正在尝试对我正在开发的 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-digested 字符串的字符串表示形式?

如果重要的话,我正在通过 Emacs+SLIME 运行 SBCL(apt-get 的版本,我相信是 1.0.29)。

最佳答案

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

关于common-lisp - 使用 Ironclad 和 Flexi-stream 进行哈希处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3900665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com