将SHA-1存储在数据库中的空间小于40个十六进制数字

时间:2017-02-09 11:13:01

标签: data-compression database base-conversion

我使用哈希算法为数据库表创建主键。我使用SHA-1算法,这对我来说非常好。数据库甚至为SHA-1提供了一个实现。计算散列的函数返回十六进制值为40个字符。因此,我将十六进制字符存储在char(40)列中。

该表将包含大量行,> = 200 Mio.行,这就是为什么我在寻找存储哈希的数据密集程度较低的方法。 40个字符乘以〜200 Mio.行将需要一些GB的存储...由于十六进制是base16我以为我可以尝试将它存储在base 256中,希望减少大约20个字符所需的字符数量。你有基于256的压缩实现的提示或论文吗?

2 个答案:

答案 0 :(得分:2)

  • 将其存储为 blob :每个字符存储8位数据而不是4位是2x压缩(您需要某种方式进行转换),
  • 切断一些字符:你有160位,但即使宇宙结束,128位对于唯一密钥也足够了,而且对于大多数用途来说,80位甚至就足够了(你不需要加密保护)。如果你有防冲突算法,使用36或40位就足够了。

答案 1 :(得分:1)

SHA-1值为20个字节。这20个字节中的所有位都很重要,没有办法压缩它们。通过以十六进制表示法存储字节,您浪费了一半的空间 - 它只需要两个十六进制数字来存储一个字节。因此,您无法压缩基础值,但您可以使用比十六进制更好的编码。

Storing as a blob是正确的答案。这是256的基础。你将每个字节存储为该字节,没有编码会产生一些开销。浪费的空间:0。

如果由于某种原因你不能这样做并且你需要使用可打印的字符串,那么你可以通过使用更紧凑的编码来做得比十六进制更好。对于十六进制,存储要求是最小值的两倍(假设每个字符存储为一个字节)。您可以使用Base64将存储要求设置为每3个字节4个字符,即您需要28个字符来存储该值。实际上,假设您知道长度为20个字节而不是21个,则base64编码将始终以=结尾,因此您只需要存储 27个字符并恢复尾随解码前=

您可以使用更多字符进一步改进编码。 Base64使用可用256字节值中的64个代码点。 ASCII(事实上的便携式)有95个可打印的字符(包括空格),但没有常见的“base95”编码,你必须自己动手。 Base85是一个中间选择,它在实践中确实有用,并允许您将20字节值存储为25个可打印的ASCII字符。