Хеширование с помощью 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-хешированную строку исходного строкового ввода, это означает, что я действительно хочу преобразовать приведенное выше обратно в строковый формат. Но,

=> (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:octets-to-string
      (ironclad:digest-sequence
        :sha1 (flexi-streams:string-to-octets "Hello there")))
"rlvU>?Þ¢4ónjòêì\\Î"

Какой вид работает, но у меня такое ощущение, что результат не должен содержать управляющих символов. Согласно гибким потокам, кодировка по умолчанию : latin , поэтому я действительно не уверен, что делать на этом этапе.

Что я делаю не так? Как мне получить строковое представление переваренной SHA1 строки в Common Lisp?

Если это важно, я запускаю SBCL (версия вне apt-get, которая, как я полагаю, 1.0.29) через Emacs + СЛАЙМ.

8
задан Rainer Joswig 10 October 2010 в 21:20
поделиться