Domanda

Sto cercando di hash alcune stringhe in un'applicazione Common Lisp su cui sto lavorando. Il pacchetto sd-sha1 sembra essere supportato, ed è stato per qualche tempo giudicare dalla pagina CLiki, che suggerisce di utilizzare Ironclad invece. Fiera abbastanza,

=> (require 'ironclad)
NIL

Ironclad non fa digest stringa però; questo è indicato sulla sua pagina del progetto come una scelta di progettazione intenzionale, quello che dovrei fare è convertire il mio stringa in un byte-string e hash. In altre parole

=> (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, ora la cosa è che il punto di questo intero esercitazione è quello di uscire una stringa SHA1 hash dell'ingresso stringa originale, il che significa che ho voglia di convertire il nuovo sopra in formato stringa. Ma,

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

L'altra opzione è lasciare flexi-streams infer la codifica corretta.

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

Che tipo di lavori, ma ho la sensazione che il risultato non dovrebbe contenere caratteri di controllo. Secondo flexi-flussi, la codifica di default è :latin, quindi sono davvero non sicuro di cosa fare in questa fase.

Che cosa sto facendo di sbagliato? Come faccio ad avere una stringa di rappresentazione di una stringa SHA1 digerito in Common Lisp?

Nel caso in cui è importante, sto correndo SBCL (la versione di apt-get, che è 1.0.29 credo) attraverso Emacs + SLIME.

È stato utile?

Soluzione

Gli ottetti si ottiene da ironclad:digest-sequence sono il digest SHA1. Si vuole una stringa che rappresenta un esadecimale la codifica di tali byte. Ironclad ha una funzione per fare questo built-in:. ironclad:byte-array-to-hex-string

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top