我有一个方向图,对于我计算的每个项目,一个crc表示它自己的数据+它指向的项目的数据。
为避免多次重新计算一个项目的数据,我想使用已计算的crc作为项目。或者在伪代码中:
crc = process_data(data);
for (auto item : items)
crc = combine_magic(crc, item.crc());
问题是combine_magic应该是什么。我使用boost crc库,但我没有在那里找到这样的功能。简单地使用xor是一个坏主意,因为我可能会完成一些指向偶数次的项目 - 这将从等式中消除它们。 Zlib似乎提供了这样的函数https://github.com/madler/zlib/blob/master/crc32.c,但我想避免再添加一个依赖项。
答案 0 :(得分:0)
如果您不想使用zlib,则只需复制zlib:crc32_combine_()
,gf2_matrix_square()
和gf2_matrix_times()
中的代码。它大约有60行代码。
您的combine_magic()
函数还需要用于计算CRC的项目中的字节数,以便将其与crc
组合。因此,将该长度与CRC一起保存。
顺便说一句,无论如何,boost都需要zlib。