En mi código, necesito archivos hash usando una variedad de algoritmos, incluido CRC32. Como también estoy usando otras funciones hash criptográficas en la familia Digest
, pensé que sería bueno mantener una interfaz coherente para todas ellas.Resumen :: CRC32 con Zlib
Para el registro, encontré digest-crc
, una joya que hace exactamente lo que quiero. El caso es que Zlib
es parte de la biblioteca estándar y tiene una implementación activa de CRC32 que me gustaría volver a utilizar. Además, está escrito en C por lo que debe ofrecer un rendimiento superior en relación con digest-crc
, que es una implementación de rubí puro.
La implementación de Digest::CRC32
en realidad parecía bastante sencillo en un primer momento:
%w(digest zlib).each { |f| require f }
class Digest::CRC32 < Digest::Class
include Digest::Instance
def update(str)
@crc32 = Zlib.crc32(str, @crc32)
end
def initialize; reset; end
def reset; @crc32 = 0; end
def finish; @crc32.to_s; end
end
Todo se ve bien:
crc32 = File.open('Rakefile') { |f| Zlib.crc32 f.read }
digest = Digest::CRC32.file('Rakefile').digest!.to_i
crc32 == digest
=> true
Por desgracia, no todo funciona:
Digest::CRC32.file('Rakefile').hexdigest!
=> "313635393830353832"
# What I actually expected was:
Digest::CRC32.file('Rakefile').digest!.to_i.to_s(16)
=> "9e4a9a6"
hexdigest
vuelve básicamente Digest.hexencode(digest)
, which works with the value of the digest at the byte level. No estoy seguro de cómo funciona esa función, así que me preguntaba si es posible lograr esto con solo el número entero devuelto desde Zlib.crc32
.
Qué plataforma de rubí estás trabajando? – 2potatocakes
@ 2potatocakes, C Ruby 1.9.3. –