压缩无序的散列集合
Compress unordered collection of hashes
我的 10M 16 字节散列 (MD5) 集合毫不奇怪地占用了 160 MB 磁盘空间。
- 如果允许重新排序,我该如何压缩它?
- 这种数据的理论最大压缩率是多少?
根据我的经验,您可以压缩 30%-60% 左右。使用 gzip 或 zip。由于哈希输出是随机的,因此没有其他技巧可以奏效。
注意:由于哈希输出不使用所有可能的 ascii 位,因此该速率可能高得多
就压缩而言,加密哈希基本上看起来像随机数,因此像 Elias–Fano 这样的方案将是最好的方案。高级思想是对哈希进行排序,根据哈希的数量选择 u + ℓ = 128,将高位 u 位用一元编码,低位 ℓ 位用二进制编码。详细的,Elias–Fano的文章很多,比如this one,这里就不多写了。
出于所有密集目的,一系列 MD5 哈希值似乎是随机数据。无法无损压缩。
107 个散列的未排序顺序中包含的信息量约为每个散列 22 位。因此,即使您对它们进行了排序(不确定为什么可以),理论上最好的压缩率也可以减少 17%。几乎不值得付出努力。
我唯一可以建议的是考虑您可以接受的误报率,并简单地丢弃一些 MD5 哈希位。您可能不需要全部 128.
您可以以增加文件数量为代价来减少存储的数据量。本质上做一些类似于部分基数排序的事情,将所有具有相同起始位的哈希存储在同一个文件中,但实际上并不存储起始位本身,因为它们在它们所在的文件中是隐含的。需要进行一些处理在存储之前删除起始位并在检索时恢复这些位。
有 256 个单独的文件:file00 到 fileFF 比方说,每个哈希可以节省一个字节,总共节省 10MB 的存储空间。使用散列值 0x3F78A2... 您将在 file3F 中存储截断的 15 字节数据:0x78A2... 并在检索时恢复前导字节。对于搜索,您可以在正确的文件中查找截断的目标,这应该比搜索整个数据库更快。
对于 16 个文件,每个哈希只能保存 4 位,其他变化也是可能的。
您将不得不判断这样的方案是否适合您的要求。与很多事情一样,保存 space 需要额外的处理。
我的 10M 16 字节散列 (MD5) 集合毫不奇怪地占用了 160 MB 磁盘空间。
- 如果允许重新排序,我该如何压缩它?
- 这种数据的理论最大压缩率是多少?
根据我的经验,您可以压缩 30%-60% 左右。使用 gzip 或 zip。由于哈希输出是随机的,因此没有其他技巧可以奏效。
注意:由于哈希输出不使用所有可能的 ascii 位,因此该速率可能高得多
就压缩而言,加密哈希基本上看起来像随机数,因此像 Elias–Fano 这样的方案将是最好的方案。高级思想是对哈希进行排序,根据哈希的数量选择 u + ℓ = 128,将高位 u 位用一元编码,低位 ℓ 位用二进制编码。详细的,Elias–Fano的文章很多,比如this one,这里就不多写了。
出于所有密集目的,一系列 MD5 哈希值似乎是随机数据。无法无损压缩。
107 个散列的未排序顺序中包含的信息量约为每个散列 22 位。因此,即使您对它们进行了排序(不确定为什么可以),理论上最好的压缩率也可以减少 17%。几乎不值得付出努力。
我唯一可以建议的是考虑您可以接受的误报率,并简单地丢弃一些 MD5 哈希位。您可能不需要全部 128.
您可以以增加文件数量为代价来减少存储的数据量。本质上做一些类似于部分基数排序的事情,将所有具有相同起始位的哈希存储在同一个文件中,但实际上并不存储起始位本身,因为它们在它们所在的文件中是隐含的。需要进行一些处理在存储之前删除起始位并在检索时恢复这些位。
有 256 个单独的文件:file00 到 fileFF 比方说,每个哈希可以节省一个字节,总共节省 10MB 的存储空间。使用散列值 0x3F78A2... 您将在 file3F 中存储截断的 15 字节数据:0x78A2... 并在检索时恢复前导字节。对于搜索,您可以在正确的文件中查找截断的目标,这应该比搜索整个数据库更快。
对于 16 个文件,每个哈希只能保存 4 位,其他变化也是可能的。
您将不得不判断这样的方案是否适合您的要求。与很多事情一样,保存 space 需要额外的处理。