Trong mã của tôi, tôi cần tệp băm bằng nhiều thuật toán, bao gồm CRC32. Vì tôi cũng đang sử dụng các hàm băm mật mã khác trong gia đình Digest
, tôi nghĩ sẽ tốt hơn nếu duy trì giao diện nhất quán cho tất cả chúng.Thông báo :: CRC32 với Zlib
Để ghi lại, tôi đã tìm thấy digest-crc
, một viên đá quý thực hiện chính xác những gì tôi muốn. Vấn đề là, Zlib
là một phần của thư viện chuẩn và có triển khai thực hiện CRC32 mà tôi muốn sử dụng lại. Ngoài ra, nó được viết bằng C vì vậy nó sẽ cung cấp hiệu suất cao hơn liên quan đến digest-crc
, đó là một thực hiện ruby tinh khiết.
Thực hiện Digest::CRC32
thực sự trông khá đơn giản lúc đầu:
%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
Tất cả mọi thứ có vẻ đúng:
crc32 = File.open('Rakefile') { |f| Zlib.crc32 f.read }
digest = Digest::CRC32.file('Rakefile').digest!.to_i
crc32 == digest
=> true
Thật không may, không phải tất cả mọi thứ hoạt động:
Digest::CRC32.file('Rakefile').hexdigest!
=> "313635393830353832"
# What I actually expected was:
Digest::CRC32.file('Rakefile').digest!.to_i.to_s(16)
=> "9e4a9a6"
hexdigest
cơ bản trả Digest.hexencode(digest)
, 012.330.. Tôi không chắc chắn làm thế nào mà chức năng hoạt động, vì vậy tôi đã tự hỏi nếu nó có thể đạt được điều này chỉ với số nguyên trở về từ Zlib.crc32
.
gì nền tảng ruby được bạn làm việc trên? – 2potatocakes
@ 2potatocakes, C Ruby 1.9.3. –