IroncladとFlexi-Streamsでハッシュします
-
29-09-2019 - |
質問
取り組んでいる一般的なLISPアプリで、いくつかの文字列をハッシュしようとしています。 SD-Sha1パッケージはサポートされていないようであり、Clikiページでしばらく判断されていました。けっこうだ、
=> (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
, 、だから私はこの段階で何をすべきか本当に分かりません。
私は何が間違っているのですか?共通のLISPでSHA1消化された文字列の文字列代表を取得するにはどうすればよいですか?
重要な場合は、Emacs+Slimeを介してSBCL(Apt-Getのバージョン、1.0.29です)を実行しています。
解決
あなたが得るオクテット ironclad:digest-sequence
それは SHA1ダイジェスト。それらのバイトの16進エンコードを表す文字列が必要です。 IronCladには、その組み込みを行う機能があります。 ironclad:byte-array-to-hex-string
.
所属していません StackOverflow