9

作業中のCommonLispアプリでいくつかの文字列をハッシュしようとしています。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.

もう1つのオプションは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だと思います)を実行しています。

4

1 に答える 1

10

取得するオクテットironclad:digest-sequence SHA1ダイジェストです。それらのバイトの16進エンコーディングを表す文字列が必要です。Ironcladには、その組み込みを実行する機能がありますironclad:byte-array-to-hex-string

于 2010-10-10T15:11:19.653 に答える