Хеширование с железной оболочкой и flexi-потоками - PullRequest
7 голосов
/ 10 октября 2010

Я пытаюсь хэшировать некоторые строки в приложении 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, поэтому я действительно не уверен, что делать на этом этапе.

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

В случае, если это имеет значение, я использую SBCL (версия из apt-get, то есть 1.0.29, я считаю,через Emacs + SLIME.

1 Ответ

9 голосов
/ 10 октября 2010

Октеты, которые вы получаете от ironclad:digest-sequence , являются дайджестом SHA1. Вы хотите строку, представляющую шестнадцатеричное кодирование этих байтов. Ironclad имеет встроенную функцию: ironclad:byte-array-to-hex-string.

...