#lz4 #解压缩 #块大小

lz-fear

一个快速纯Rust无安全隐患的LZ4压缩和解压缩实现

3个不稳定版本

0.2.0 2024年2月8日
0.1.1 2020年5月21日
0.1.0 2020年4月16日

146压缩 中排名

Download history 308/week @ 2024-04-20 475/week @ 2024-04-27 646/week @ 2024-05-04 592/week @ 2024-05-11 795/week @ 2024-05-18 589/week @ 2024-05-25 376/week @ 2024-06-01 405/week @ 2024-06-08 725/week @ 2024-06-15 504/week @ 2024-06-22 457/week @ 2024-06-29 568/week @ 2024-07-06 768/week @ 2024-07-13 540/week @ 2024-07-20 767/week @ 2024-07-27 461/week @ 2024-08-03

每月下载量 2,561
用于 14 crate(其中5个直接使用)

MIT 许可证

145KB
896

lz-fear

本crate旨在使用纯Rust和无安全隐患的方式实现LZ4压缩和解压缩算法,以及用于LZ4文件的封装格式。输出与C参考实现完全匹配,字节对应字节。在撰写本文时,这也是我所知最快的无安全隐患实现。

lz4 crate调用C库。compress crate有一个依赖于unsafe的实现。Redox实现(下面会详细介绍)在某些情况下速度较慢。

解压缩器状态:Beta。工作良好,速度极快(至少在我测试的官方C实现中如此)。

压缩器状态:Alpha。对于所有配置,您可以期望它产生完美的输出(即与C库产生的输出完全相同)。非默认块大小是这里的例外,目前尚不确定问题所在。字典的实现方式也略有不同。还有一个其他未知边缘情况,输出略有不同。请注意,所有这些情况仍然产生有效且正确的输出,只是编码方式与C实现略有不同(在这些情况下,压缩率可能略差)。API可能还会略有变化。名为“dolz4”的示例是一个压缩器,但目前缺少CLI。您必须通过更改代码来配置它。性能良好,但比C实现慢约2-3倍。当前瓶颈似乎是写入输出时的范围检查过多(大约25%的周期花费在这里),这也导致编译器完全崩溃,有时会为输出数组中的1字节和4字节写入发出一系列copy_from_slice调用。需要帮助。

如果您查看git历史记录,这严格来说是来自@johannesvollmer的分支。他拿来了redox-os的lz4压缩,并将其重构为可用的库crate。

然而,在注意到性能问题后,我逐渐从头开始重写了压缩器和解压缩器,使其与2400行官方C实现(而且这仅仅是没有帧的原始格式!)的混乱程度非常接近。诚然,它们包含了许多优化(为了性能故意读取超出缓冲区边界),但我自豪地说,我仅用400行完全安全的Rust就实现了类似性能。

代码模糊测试

模糊测试需要一个夜间工具链。目前确认这个项目的模糊测试与以下工具链兼容

rustc 1.44.0-nightly (f509b26a7 2020-03-18)

运行

cargo install cargo-fuzz
cargo +nightly fuzz run roundtrip_fuzz

依赖项

~0.6-1.1MB
~25K SLoC