lz4压缩算法java实现_深入浅出lz4压缩算法

本文详细介绍了lz4压缩算法的工作原理,包括压缩格式、压缩率和压缩算法实现过程。lz4因其高效的压缩和解压缩速度在Android和iOS系统中被广泛应用于内存压缩。文章还给出了lz4在Java中的实现示例,以及如何处理特殊情况,如offset和match length超长的情况。
摘要由CSDN通过智能技术生成

简介

lz4是目前综合来看效率最高的压缩算法,更加侧重压缩解压速度,压缩比并不是第一。在当前的安卓和苹果操作系统中,内存压缩技术就使用的是lz4算法,及时压缩手机内存以带来更多的内存空间。本质上是时间换空间。

压缩原理

lz4压缩算法其实很简单,举个压缩的栗子

输入:abcde_bcdefgh_abcdefghxxxxxxx

输出:abcde_(5,4)fgh_(14,5)fghxxxxxxx

其中两个括号内的便代表的是压缩时检测到的重复项,(5,4) 代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复。当然也可以说"cde"是个重复项,但是根据算法实现的输入流扫描顺序,我们取到的是第一个匹配到的,并且长度最长的作为匹配。

1.压缩格式

压缩后的数据是下面的格式

824e1cf4f920

输入:abcde_bcdefgh_abcdefghxxxxxxx

输出:tokenabcde_(5,4)fgh_(14,5)fghxxxxxxx

格式:[token]literals(offset,match length)[token]literals(offset,match length)....

其他情况也可能有连续的匹配:

输入:fghabcde_bcdefgh_abcdefghxxxxxxx

输出:fghabcde_(5,4)(13,3)_(14,5)fghxxxxxxx

格式:[token]literals(offset,match length)[token](offset,match length)....

这里(13,3)长度3其实并不对,match length匹配的长度默认是4

Literals指没有重复、首次出现的字节流,即不可压缩的部分

Match指重复项,可以压缩的部分

Token记录literal长度,match长度。作为解压时候memcpy的参数

2.压缩率

可以想到,如果重复项越多或者越长,压缩率就会越高。上述例子中"bcde"在压缩后,用(5,4)表示,即从4个bytes压缩成了3个bytes来表示,其中offset 2bytes, match length 1byte,能节省1个byte。

3.压缩算法实现

大致流程,压缩过程以至少4个bytes为扫描窗口查找匹配,每次移动1byte进行扫描,遇到重复的就进行压缩。

由于offset用2bytes表示,只能查找到到2^16(64kb)距离的匹配,对于压缩4Kb的内核页,只需要用到12位。

扫描的步长1byte是可以调整的,即对应LZ4_compress_fast机制,步长变长可以提高压缩解压速度,减少压缩率。

824e1cf4f920

//src是输入流,dst是输出,还需要使用一个hash表记录前面一段距离内的字符串,用来查找之前是否有匹配

void lz4_encode_2gb(uint8_t ** dst_ptr,

size_t dst_size,

const uint8_t ** src_ptr,

const uint8_t * src_begin,

size_t src_size,

lz4_hash_entry_t hash_table[LZ4_COMPRESS_HASH_ENTRIES],

int skip_final_literals)

{

uint8_t *dst = *dst_ptr; // current output stream position

uint8_t *end = dst + dst_size - LZ4_GOFAST_SAFETY_MARGIN;

const uint8_t *src = *src_ptr; // current input stream literal to encode

const uint8_t *src_end = src + src_size - LZ4_GOFAST_SAFETY_MAR

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值