Nel mio codice, ho bisogno di file hash che utilizzano una varietà di algoritmi, incluso CRC32. Poiché sto anche utilizzando altre funzioni hash crittografiche nella famiglia Digest
, ho pensato che sarebbe stato utile mantenere un'interfaccia coerente per tutti.Digest :: CRC32 with Zlib
Per la cronaca, ho trovato digest-crc
, una gemma che fa esattamente quello che voglio. Il fatto è che Zlib
fa parte della libreria standard e ha un'implementazione funzionante di CRC32 che vorrei riutilizzare. Inoltre, è scritto in C, quindi dovrebbe offrire prestazioni superiori in relazione a digest-crc
, che è un'implementazione di puro rubino.
Implementazione Digest::CRC32
in realtà sembrava abbastanza semplice in un primo 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
Tutto sembra giusto:
crc32 = File.open('Rakefile') { |f| Zlib.crc32 f.read }
digest = Digest::CRC32.file('Rakefile').digest!.to_i
crc32 == digest
=> true
Purtroppo, non tutto funziona:
Digest::CRC32.file('Rakefile').hexdigest!
=> "313635393830353832"
# What I actually expected was:
Digest::CRC32.file('Rakefile').digest!.to_i.to_s(16)
=> "9e4a9a6"
hexdigest
restituisce fondamentalmente Digest.hexencode(digest)
, 012.330.. Non sono sicuro di come funzioni quella funzione, quindi mi chiedevo se è possibile ottenere ciò con il numero intero restituito da Zlib.crc32
.
Quale piattaforma rubino stai lavorando? – 2potatocakes
@ 2potatocakes, C Ruby 1.9.3. –