gpt4 book ai didi

ruby - 摘要::CRC32 与 Zlib

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:38 25 4
gpt4 key购买 nike

在我的代码中,我需要使用各种算法(包括 CRC32)对文件进行哈希处理。因为我还在 Digest 系列中使用其他加密哈希函数,所以我认为为它们维护一个一致的接口(interface)会很好。

为了记录,我确实找到了 digest-crc ,一颗完全符合我要求的 gem 。问题是,Zlib 是标准库的一部分,并且有一个我想重用的 CRC32 工作实现。此外,它是用 C 编写的,因此它应该提供与 digest-crc 相关的卓越性能,后者是纯 ruby​​ 实现。

实现 Digest::CRC32 一开始看起来非常简单:

%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

一切正常:

crc32 = File.open('Rakefile') { |f| Zlib.crc32 f.read }
digest = Digest::CRC32.file('Rakefile').digest!.to_i
crc32 == digest
=> true

不幸的是,并非一切正常:

Digest::CRC32.file('Rakefile').hexdigest!
=> "313635393830353832"

# What I actually expected was:
Digest::CRC32.file('Rakefile').digest!.to_i.to_s(16)
=> "9e4a9a6"

hexdigest 基本上返回 Digest.hexencode(digest), which works with the value of the digest at the byte level .我不确定该函数是如何工作的,所以我想知道是否可以仅使用 Zlib.crc32 返回的整数来实现这一点。

最佳答案

Digest 期望 digest 返回构成校验和的原始字节,即在 crc32 的情况下,构成 32 位整数的 4 个字节。但是,您返回的是一个字符串,其中包含该整数的以 10 为底的表示形式。

你想要类似的东西

[@crc32].pack('V')

将该整数转换为表示该整数的字节。请去阅读 pack 及其各种格式说明符 - 有很多打包整数的方法,具体取决于字节是否应以 native 字节序、大字节序、小字节序等形式呈现,因此您应该弄清楚哪个一个符合您的需求

关于ruby - 摘要::CRC32 与 Zlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com