ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis6.0.5之lzf阅读笔记1--压缩解压定义

2021-07-12 17:33:22  阅读:183  来源: 互联网

标签:redis6.0 -- out len define lzf data LZF


********************lzf.h*************************************************************************************************
/***********************************************************************
**
**    lzf -- an extremely fast/free compression/decompression-method 一种非常快速/免费的压缩/解压方法
**    http://liblzf.plan9.de/
**
**    This algorithm is believed to be patent-free.  这种算法被认为是无专利的
**
***********************************************************************/
#define LZF_VERSION 0x0105 /* 1.5, API version */  LZF的版本,方便压缩数据之间的兼容
/*
 * Compress in_len bytes stored at the memory block starting at
 * in_data and write the result to out_data, up to a maximum length
 * of out_len bytes.
压缩存储在内存块中从in_data开始的in_len长字节的数据,
将压缩结果写入到out_data中,最大的长度为out_len个字节
 *
 * If the output buffer is not large enough or any error occurs return 0,
 * otherwise return the number of bytes used, which might be considerably
 * more than in_len (but less than 104% of the original size), so it
 * makes sense to always use out_len == in_len - 1), to ensure _some_
 * compression, and store the data uncompressed otherwise (with a flag, of
 * course.
如果输出的缓存不够大或者任何错误发生,返回0,否则返回使用过的字节数,这个可能超过输入的长度in_len
(但是会少于原大小的百分之104),所以使用out_len == in_len - 1 时有意义的,确保压缩结果,否则保存不压缩的结果,当然需要带标志

 * lzf_compress might use different algorithms on different systems and
 * even different runs, thus might result in different compressed strings
 * depending on the phase of the moon or similar factors. However, all
 * these strings are architecture-independent and will result in the
 * original data when decompressed using lzf_decompress.
 lzf压缩算法使用在不同的系统甚至不同的运行中使用不同的系统,这个可能导致基于指标或者类似的因素产生不同的压缩字符串。
 然而,所有的压缩字符串都时独立于体系结构的,如果使用lzf解压都能获得原始的数据
 *
 * The buffers must not be overlapping. 缓存不能重叠
 *
 * If the option LZF_STATE_ARG is enabled, an extra argument must be
 * supplied which is not reflected in this header file. Refer to lzfP.h
 * and lzf_c.c.
如果选项LZF_STATE_ARG是有效的,一个额外参数必需提供,该参数不会反映在这个头文件,参见头文件lzfP.h 和 lzf_c.c
 */
unsigned int
lzf_compress (const void *const in_data,  unsigned int in_len,
              void             *out_data, unsigned int out_len);

/*
 * Decompress data compressed with some version of the lzf_compress
 * function and stored at location in_data and length in_len. The result
 * will be stored at out_data up to a maximum of out_len characters.
解压使用某个lzf压缩函数压缩的保存在in_data中的数据,长度为in_len。将结果保存到out_data中,最大长度为out_len个字符
 * If the output buffer is not large enough to hold the decompressed
 * data, a 0 is returned and errno is set to E2BIG. Otherwise the number
 * of decompressed bytes (i.e. the original length of the data) is
 * returned.
如果输出的缓存不是足够大能保持解压的数据,0会返回,错误代码会设置为E2BIG。否则返回解压后的字节数(例如,数据的原始长度)
 * If an error in the compressed data is detected, a zero is returned and
 * errno is set to EINVAL.
如果有错误在压缩的数据中发现,返回0, 错误码设置为EINVAL
 * This function is very fast, about as fast as a copying loop.
 这个函数是非常快的,和拷贝循环一样的快!
 */

unsigned int
lzf_decompress (const void *const in_data,  unsigned int in_len,
                void             *out_data, unsigned int out_len);

#endif
*********************************************************************************************************************
***************************************lzfP.h************************************************************************
#ifndef LZFP_h
#define LZFP_h

#define STANDALONE 1 /* at the moment, this is ok. */

#ifndef STANDALONE
# include "lzf.h"
#endif

/*
 * Size of hashtable is (1 << HLOG) * sizeof (char *)  hash表的大小为  (1 << HLOG) * sizeof (char *)
 * decompression is independent of the hash table size  解压同hash表大小无关
 * the difference between 15 and 14 is very small HLOG为14和15之间的差距很小
 * for small blocks (and 14 is usually a bit faster).  对于小的块(14通常会快一点)
 * For a low-memory/faster configuration, use HLOG == 13; 对于一个低内存/高速 的配置,使用HLOG为13
 * For best compression, use 15 or 16 (or more, up to 22). 对一个最好的压缩比,使用15或者16(或者更多到22)
 */
#ifndef HLOG
# define HLOG 16
#endif

/*
 * Sacrifice very little compression quality in favour of compression speed.
 * This gives almost the same compression as the default code, and is
 * (very roughly) 15% faster. This is the preferred mode of operation.
 */
牺牲很少的压缩质量从而提高压缩的速度。这个提供了几乎于原代码相同的压缩比,但是能提高百分之15的速度(粗略计算)。
这个是优选的操作
#ifndef VERY_FAST
# define VERY_FAST 1
#endif

/*
 * Sacrifice some more compression quality in favour of compression speed.
 * (roughly 1-2% worse compression for large blocks and
 * 9-10% for small, redundant, blocks and >>20% better speed in both cases)
 * In short: when in need for speed, enable this for binary data,
 * possibly disable this for text data.
 */
为了压缩速度牺牲一些压缩质量(对大数据块的压缩比大约差百分之1到2,对于冗余的小的块差百分之9到10,
但是对于这两种情况可以获得大于百分之20的速度)。简单的说,如果需要提高速度,
对于二进制数据使用这个选项,对于文本数据关闭这个选项
#ifndef ULTRA_FAST
# define ULTRA_FAST 0
#endif

/*
 * Unconditionally aligning does not cost very much, so do it if unsure
 无条件对齐 不会花费很多代价,所以如果不确定就这样做(即对齐)
 */
#ifndef STRICT_ALIGN
# if !(defined(__i386) || defined (__amd64))
#  define STRICT_ALIGN 1
# else
#  define STRICT_ALIGN 0
# endif
#endif

/*
 * You may choose to pre-set the hash table (might be faster on some
 * modern cpus and large (>>64k) blocks, and also makes compression
 * deterministic/repeatable when the configuration otherwise is the same).
 */
你可以选择预设hash表(这样可能使得在某些现代cpu和大数据块(大于64k)速度更快,
并且在其它配置相同时,使得压缩具有确定性和重复性)
#ifndef INIT_HTAB
# define INIT_HTAB 0
#endif

/*
 * Avoid assigning values to errno variable? for some embedding purposes
 * (linux kernel for example), this is necessary. NOTE: this breaks
 * the documentation in lzf.h. Avoiding errno has no speed impact.
 */
避免关联错误信息到变量errno,这是为了嵌入目的考虑的(例如Linux内核),那么这个就和必要。(不能同内核错误混在一起)
注意:这种情况打破了文档lzf.h中的描述。 避免错误代码不影响速度
#ifndef AVOID_ERRNO
# define AVOID_ERRNO 0
#endif

/*
 * Whether to pass the LZF_STATE variable as argument, or allocate it
 * on the stack. For small-stack environments, define this to 1.
 * NOTE: this breaks the prototype in lzf.h.
 */
 是否传入LZF_STATE变量当做一个参数,或者分配在栈上分配它。对于一个小栈的环境,定义为1.
 注意:这种情况不同于定于在lzf.h中的原型
#ifndef LZF_STATE_ARG
# define LZF_STATE_ARG 0
#endif

/*
 * Whether to add extra checks for input validity in lzf_decompress
 * and return EINVAL if the input stream has been corrupted. This
 * only shields against overflowing the input buffer and will not
 * detect most corrupted streams.
 * This check is not normally noticeable on modern hardware
 * (<1% slowdown), but might slow down older cpus considerably.
 */
是否对输入lzf解压数据的有效性添加额外的检查,如果输入的流损坏,返回EINVAL。
这个值针对输入缓冲区的溢出,不会检车更多的损坏数据流。
这个检查在现代硬件上不会很明显降低速速(小于百分之1的降速),但是对老的cpu会有明显的降速
#ifndef CHECK_INPUT
# define CHECK_INPUT 1
#endif

/*
 * Whether to store pointers or offsets inside the hash table. On
 * 64 bit architetcures, pointers take up twice as much space,
 * and might also be slower. Default is to autodetect.
 */
是否在hash表内部保存指针或者偏移量。在64比特架构中,指正需要使用两倍的空间,
可能导致变慢。默认是自动检测(是否使用保存模式)
/*#define LZF_USER_OFFSETS autodetect */

/*****************************************************************************/
/* nothing should be changed below */ 以下不允许修改

#ifdef __cplusplus
# include <cstring>
# include <climits>
using namespace std;
#else
# include <string.h>
# include <limits.h>
#endif

#ifndef LZF_USE_OFFSETS
# if defined (WIN32)                                      Windows平台
#  define LZF_USE_OFFSETS defined(_M_X64)    根据是否定义了_M_X64 来设定  LZF_USE_OFFSETS的值  
-- https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?redirectedfrom=MSDN&view=msvc-160    
-- _M_X64 Defined as the integer literal value 100 for compilations that target x64 processors. Otherwise, undefined.          
# else
#  if __cplusplus > 199711L  大于这值就用c++的库
#   include <cstdint>
#  else
#   include <stdint.h>  小于就用c库
#  endif
#  define LZF_USE_OFFSETS (UINTPTR_MAX > 0xffffffffU) 是否大于0xffffffffU来设定 LZF_USE_OFFSETS的值
# endif
#endif

typedef unsigned char u8;

#if LZF_USE_OFFSETS  如果定义偏移量为1
# define LZF_HSLOT_BIAS ((const u8 *)in_data) 就从输入数据开始的点为偏移量
  typedef unsigned int LZF_HSLOT;  用整型
#else
# define LZF_HSLOT_BIAS 0
  typedef const u8 *LZF_HSLOT;  单个字节
#endif

typedef LZF_HSLOT LZF_STATE[1 << (HLOG)]; 定义一个2^16的数组,具体大小更上面定义的变量类型有关

#if !STRICT_ALIGN
/* for unaligned accesses we need a 16 bit datatype. */ 对于没有对齐的访问,我们需要一个16位的数据类型
# if USHRT_MAX == 65535 如果shot的最大值为65535,那么16位使用short即可
    typedef unsigned short u16;
# elif UINT_MAX == 65535  如果int的最大值为65535,那么使用int
    typedef unsigned int u16;
# else
#  undef STRICT_ALIGN  
#  define STRICT_ALIGN 1  严格对齐为1
# endif
#endif

#if ULTRA_FAST 如果定义了超级快
# undef VERY_FAST  取消 非常快的定义
#endif

#endif
*********************************************************************************************************************

 

标签:redis6.0,--,out,len,define,lzf,data,LZF
来源: https://www.cnblogs.com/cquccy/p/15002925.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有