2010-10-10 9 views
7

Estoy tratando de ajustar algunas cadenas en una aplicación Common Lisp en la que estoy trabajando. El paquete sd-sha1 parece no ser compatible, y ha sido juzgado por la página CLiki por algún tiempo, lo que sugiere utilizar Ironclad. Lo suficiente,Hashing con acorazado y flexi-streams

=> (require 'ironclad) 
NIL 

Ironclad no hace resúmenes de cadenas sin embargo; esto se afirma en su página de proyecto como una opción de diseño intencional, lo que se supone que debo hacer es convertir mi cadena en una cadena de bytes y hacer hash. En otras palabras

=> (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) 

Ok, ahora la cosa es que el punto de todo este ejercicio es conseguir una sarta sha1-hash de la cadena de entrada original, lo que significa que realmente quiero convertir el anterior de nuevo en formato de cadena Pero,

=> (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. 

La otra opción es dejar que flexi-streams inferir la codificación correcta.

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

Qué tipo de trabajo funciona, pero tengo la sensación de que el resultado no debe contener caracteres de control. Según flexi-streams, la codificación predeterminada es :latin, así que no estoy seguro de qué hacer en esta etapa.

¿Qué estoy haciendo mal? ¿Cómo obtengo una cadena de representación de una cadena digerida con SHA1 en Common Lisp?

En caso de que importe, estoy ejecutando SBCL (la versión de apt-get, que es 1.0.29 creo) a través de Emacs + SLIME.

Respuesta

9

Los octetos que obtiene de ironclad:digest-sequenceson resumen de SHA1. Desea una cadena que represente una codificación hexadecimal de esos bytes. Ironclad tiene una función para hacer eso incorporado: ironclad:byte-array-to-hex-string.

+1

Hombre, tengo que aprender a leer los documentos completos antes de preguntar sobre cosas. La página de Ironclad enumera las funciones de utilidad anteriores. En otras palabras, lo que debería haber hecho fue '(ironclad: byte-array-to-hex-string (ironclad: digest-sequence: sha1 (ironclad: ascii-string-to-byte-array" Hola "))) ' en lugar de incluir flexi-streams en esto (aunque probablemente aún sería útil si no tuviera que lidiar con cadenas ascii simples). Gracias por señalarme en la dirección correcta. – Inaimathi

+0

Babel también es útil para codificar cadenas no ASCII en vectores de octetos. – Xach

Cuestiones relacionadas