2011-03-23 21 views
10

Me gustaría poder tomar una cadena arbitraria, ejecutarla a través de una función hash (como MD5) y luego interpretar el resumen resultante en base-36.Base-36 representación de Digest

Sé que ya existe una biblioteca Digest en Ruby, pero hasta donde sé, no puedo obtener los bytes brutos de un resumen; la función to_s está mapeada a hexdigest, que es, por supuesto, base-16.

Respuesta

20

Fixnum # to_s acepta una base como argumento. Lo mismo ocurre con la cadena # to_i. Debido a esto, se puede convertir de la cadena de base 16 a un int, y luego a la base 36 de cadena:

i = hexstring.to_i(16) 
base_36 = i.to_s(36) 
+0

Funciona muy bien! ¿Pero es posible extraer los bytes sin formato de un objeto Digest de alguna manera? –

+0

No tengo nada incorporado que sepa, pero esta pregunta/respuesta muestra cómo se puede convertir un Fixnum o Bignum a su matriz de bytes de complemento a 2: http://stackoverflow.com/questions/5284369/ruby-return-byte-array- containing-twos-complement-representation-of-bignum-fix –

+0

Para referencia futura; ver mi respuesta (actualmente debajo de esta) para obtener los bytes crudos de un resumen. –

3

Se puede acceder a los bytes sin digerir usando Digest::Class#digest:

Digest::SHA1.digest("test") 
# => "\xA9J\x8F\xE5\xCC\xB1\x9B\xA6\x1CL\bs\xD3\x91\xE9\x87\x98/\xBB\xD3" 

desgracia de ese señalar que no estoy seguro de cómo llegar en base36 sin pasar primero a través de otra base numérica como en la respuesta de Sammy Larbi ..

bytes = Digest::SHA1.digest("test") 
Digest.hexencode(bytes).to_i(16).to_s(36) 

Esperemos que se puede encontrar una mejor manera de pasar de byt prima es a base36.