用python实现redis中的密钥压缩

用python实现redis中的密钥压缩,python,redis,Python,Redis,我有非常大的数据集,我正在考虑使用。我的数据集包括:sha1散列和与该散列关联的附加值 我使用我的sha1散列作为Redis中的一个键,我的目标是以某种方式压缩它)。我尝试使用and then,但新哈希比原始的sha1hash更长: [alexus@wcmisdlin02 ~]$ python Python 2.7.5 (default, Nov 20 2015, 02:00:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Type "

我有非常大的数据集,我正在考虑使用。我的数据集包括:
sha1
散列和与该散列关联的附加值

我使用我的
sha1
散列作为
Redis
中的一个键,我的目标是以某种方式压缩它)。我尝试使用and then,但新哈希比原始的
sha1
hash更长:

[alexus@wcmisdlin02 ~]$ python
Python 2.7.5 (default, Nov 20 2015, 02:00:19) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hashlib
>>> hashlib.sha1('test').hexdigest()
'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'
>>> len(hashlib.sha1('test').hexdigest())
40
>>> import zlib
>>> len(zlib.compress(hashlib.sha1('test').hexdigest()))
46
>>> import base64
>>> base64.b64encode(zlib.compress(hashlib.sha1('test').hexdigest()))
'eJwFwQkBACAIA8BKIihbHB7pH8G7oAXmnaoUZlwpqwXXVsojnNiT2foB7msLYg=='
>>> len(base64.b64encode(zlib.compress(hashlib.sha1('test').hexdigest())))
64
>>> 
你知道怎么做吗


我也在研究以下方面:


散列函数的结果或多或少是随机数据,因此无法真正压缩它们。根据您处理的对象/散列的方式以及您对冲突的关注程度,如果您希望节省空间或使用具有较短摘要大小(md5,sha2-256的一半)的算法,您可以只使用sha1值的一部分。此外,您无法将摘要从十六进制转换为原始二进制,从而节省50%。最后,定义“非常大”,键的大小很可能不会有太大区别。

谢谢您的回复!关于冲突,
SHA1
对我来说很好,不幸的是,我不能使用部分散列,就“非常大”的数据集而言,我的情况是到目前为止大约有1B个散列。为什么没有部分散列?有没有可能更详细地描述一下您的用例?虽然我非常欣赏思考“开箱即用”的方法,这让我想知道,在引入冲突之前,我可能会在散列中释放多少字符…相当多。2^80 = 1208925819614629174706176. 您的10亿个对象将在该空间中容纳1208925819614629次…:)如果你真的担心碰撞,你无论如何都需要处理它们。