Хешинг с железными и гибкими потоками
-
29-09-2019 - |
Вопрос
Я пытаюсь выбрать некоторые строки в общем приложении Lisp, над которым я работаю. Пакет SD-SHA1, похоже, неподдерживается, и в течение некоторого времени, судя по странице Клики, которая предлагает вместо этого 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
, Так что я действительно не уверен, что делать на этом этапе.
Что я делаю не так? Как получить string-представление о Sha1-переваренной струны в общем Lisp?
В случае, если это имеет значение, я запускаю SBCL (версия APT-Get, которая составляет 1.0.29, я верю) через Emacs + Slime.
Решение
Октеты, от которых вы получаете ironclad:digest-sequence
находятся Sha1 дайджест. Вы хотите строку, представляющую шестнадцатеричное кодирование этих байтов. IronClad имеет функцию, чтобы сделать это встроенный: ironclad:byte-array-to-hex-string
.