API参考
函数说明
Snappy已优化函数如表 1 Snappy已优化函数列表所示。
| 名称 | 说明 |
|---|---|
| Compress | 将输入数据压缩为Snappy格式,支持任意大小的数据压缩。 |
| Uncompress | 将Snappy格式的压缩数据解压缩为原始数据。 |
| CompressFromIOVec | 从分散的IOVec结构压缩数据,返回压缩后数据长度。 |
| RawUncompressToIOVec | 将压缩数据解压缩到分散的IOVec结构中。 |
函数定义
Compress
函数功能
将输入数据压缩为Snappy格式。Snappy使用LZ77算法的变种,通过哈希表查找重复字符串,实现高速压缩。
函数定义
size_t Compress(const char* input, size_t input_length, std::string* compressed);
参数说明
| 参数名 | 描述 | 取值范围 | 输入/输出 |
|---|---|---|---|
| input | 指向待压缩原始数据的指针。 | 非空指针,指向至少input_length字节的有效数据 | 输入 |
| input_length | 输入数据的长度(字节数)。 | 大于0的整数 | 输入 |
| compressed | 指向std::string对象的指针,用于存储压缩后的数据。原始内容会被覆盖。 | 非空指针,指向一个有效的std::string实例 | 输出 |
返回值
返回压缩后数据的长度(字节数)。压缩后的数据会写入compressed指向的字符串中。
说明: 压缩后的数据大小通常比原始数据小,但如果数据已经高度压缩或随机性强,压缩后可能会更大。Snappy设计目标是速度而非压缩率。
示例
#include <iostream>
#include <string>
#include "snappy.h"
int main() {
std::string input = "This is a test string that will be compressed. "
"Repeated data: test test test test test";
std::string compressed;
snappy::Compress(input.data(), input.size(), &compressed);
std::cout << "Original size: " << input.size() << " bytes" << std::endl;
std::cout << "Compressed size: " << compressed.size() << " bytes" << std::endl;
std::cout << "Compression ratio: "
<< (100.0 * compressed.size() / input.size()) << "%" << std::endl;
return 0;
}
运行结果:
Original size: 86 bytes
Compressed size: 85 bytes
Compression ratio: 98.84%
Uncompress
函数功能
将Snappy格式的压缩数据解压缩为原始数据。
函数定义
bool Uncompress(const char* compressed, size_t compressed_length, std::string* uncompressed);
参数说明
| 参数名 | 描述 | 取值范围 | 输入/输出 |
|---|---|---|---|
| compressed | 指向压缩数据的指针。 | 非空指针,指向有效的snappy压缩数据 | 输入 |
| compressed_length | 压缩数据的长度。 | 大于0的整数 | 输入 |
| uncompressed | 指向std::string对象的指针,用于存储解压后的原始数据。 | 非空指针,指向一个有效的std::string实例 | 输出 |
返回值
- 成功:返回true,解压成功,*uncompressed中包含原始数据
- 失败:返回false(例如数据损坏、格式错误、长度不匹配或缓冲区不足)。此时uncompressed指向的字符串内容未定义(可能为空或部分数据,不建议依赖)。
说明: 解压缩时需要确保压缩数据是完整的Snappy格式数据。如果数据损坏或格式错误,函数会返回false。
示例
#include <iostream>
#include <string>
#include "snappy.h"
int main() {
std::string original = "This is test data for compression and decompression.";
// 压缩
std::string compressed;
snappy::Compress(original.data(), original.size(), &compressed);
// 解压缩
std::string decompressed;
bool success = snappy::Uncompress(compressed.data(), compressed.size(), &decompressed);
if (success) {
std::cout << "Decompression successful!" << std::endl;
std::cout << "Original matches: "
<< (original == decompressed ? "Yes" : "No") << std::endl;
} else {
std::cout << "Decompression failed!" << std::endl;
}
return 0;
}
运行结果:
Decompression successful!
Original matches: Yes
CompressFromIOVec
函数功能
从分散的IOVec结构压缩数据,适用于分散的数据源。
函数定义
size_t CompressFromIOVec(const struct iovec* iov, size_t iov_cnt,
std::string* compressed);
参数说明
| 参数名 | 描述 | 取值范围 | 输入/输出 |
|---|---|---|---|
| iov | 指向iovec结构体数组的指针,每个元素描述一个数据缓冲区的起始地址和长度。 | 有效的iovec数组指针 | 输入 |
| iov_cnt | IOVec数组元素数量。 | 大于0的整数 | 输入 |
| compressed | 指向std::string对象的指针,用于存储压缩后的数据。 | 非空指针,指向一个有效的std::string实例 | 输出 |
返回值
返回压缩后数据的长度。
RawUncompressToIOVec
函数功能
将压缩数据解压缩到分散的IOVec结构中,适用于避免数据拷贝的零拷贝场景。
函数定义
bool RawUncompressToIOVec(const char* compressed, size_t compressed_length,
const struct iovec* iov, size_t iov_cnt);
参数说明
| 参数名 | 描述 | 取值范围 | 输入/输出 |
|---|---|---|---|
| compressed | 指向压缩数据的指针。 | 非空指针,指向有效的Snappy压缩数据 | 输入 |
| compressed_length | 压缩数据的长度。 | 大于0的整数 | 输入 |
| iov | 指向iovec结构体数组的指针,每个元素描述一个输出缓冲区的起始地址和长度。其累积大小必须至少等于解压缩后的数据长度。 | 有效的iovec数组指针 | 输出 |
| iov_cnt | IOVec数组元素数量。 | 大于0的整数 | 输入 |
返回值
- 成功:返回true
- 失败:返回false
C接口
Snappy也提供C语言接口,用于非C++环境。
snappy_compress
snappy_status snappy_compress(const char* input, size_t input_length,
char* compressed, size_t* compressed_length);
snappy_uncompress
snappy_status snappy_uncompress(const char* compressed, size_t compressed_length,
char* uncompressed, size_t* uncompressed_length);
snappy_max_compressed_length
size_t snappy_max_compressed_length(size_t source_length);
返回给定源数据长度下,压缩后数据的最大可能长度。