有没有什么广泛使用的算法将 16 进制数据缩短(用于压缩哈希值)?

2019-11-23 14:42:31 +08:00
 nyse

需求是这样的,有个数据表,存放大量哈希值。

无论是 md5 还是 sha1 的长度都比较长,而且他们的取值范围都是 16 进制数( 0-9,a-f )

有没有什么广泛使用的算法,用( 0-9,a-z,A-Z )来表示他们,从而缩短他们的长度。

注:

  1. 之所以要这样缩短的主要原因是为了减少数据库空间占用;

  2. 这个算法最好是使用的比较广泛的,因为这个需求自己写一个程序映射应该也可以,但还是希望能找到一个更加广泛通用的解决方案;

  3. 这个算法要能互逆

6001 次点击
所在节点    算法
28 条回复
also24
2019-11-23 14:44:37 +08:00
这个不需要算法,进制换算就够了
also24
2019-11-23 14:47:46 +08:00
或者这样说,你对 md5 的输出有误解

md5 输出的是 128bit,只是为了方便你看,才展示为 32 位 HEX String

你完全可以直接存储这 128bit 以达到最小化空间占用
NeinChn
2019-11-23 15:02:59 +08:00
MD5/SHA1 能互逆?
ipwx
2019-11-23 15:03:59 +08:00
你可以用 binary type 存。但如果这你还不满足,那没有办法了
ipwx
2019-11-23 15:05:01 +08:00
事实上每两位 hex 等于一位二进制八位
nyse
2019-11-23 15:05:15 +08:00
@NeinChn #3 不是 MD5/SHA1 互逆
nyse
2019-11-23 15:08:45 +08:00
@also24 #2
@ipwx #5

由于可能用来查询,所以不太适合直接存二进制,我就在想有没有办法转成另外一种字符串
0TSH60F7J2rVkg8t
2019-11-23 15:12:35 +08:00
把二进制 binary 用 base64 encode 一下就行了
ipwx
2019-11-23 15:14:14 +08:00
@nyse 二进制为啥不能查
hdbzsgm
2019-11-23 15:16:27 +08:00
@ahhui #8 你确定 base64 是压缩吗
also24
2019-11-23 15:18:48 +08:00
@nyse #7
我不清楚你的查询指的是在什么体系内进行查询,至少 mysql 是支持 binary 查询的。

如果你一定要把它变成 『可见字符』,那就如 8 楼所说,base64 吧
woodensail
2019-11-23 15:19:05 +08:00
base64 了解一下,一个字节能存 6bit,24 个字符搞定
或者不要求可读性,直接存字节数组,16 个字节搞定
unixeno
2019-11-23 15:19:18 +08:00
@hdbzsgm 对比 base16 来说确实是压缩
ipwx
2019-11-23 15:19:47 +08:00
@also24 可见字符前端就行了吧,后台查询要什么可见
passerbytiny
2019-11-23 15:19:55 +08:00
你经常看到的 Md5/SHA1/UUID 等,并不是 16 进制数据,他的标准叫法是十六进制转储 /Hex dump ( https://zh.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E8%BD%AC%E5%82%A8 )。本质上,是处于可视化的目的,将二进制数据以十六进制数据(字符串形式)打印出来。

虽然你看到的是十六进制,但存储的不一定是。如果存储原始数据,那么是二进制数据;如果存储你看到的十六进制字符串,那么仍然是二进制数据,只不过是经过转码后的二进制数据,长度是原始二进制数据的两倍。所以,你只需要把存储格式,从字符串格式,改成原始二进制格式,就会压缩一半的存储空间。
geelaw
2019-11-23 15:22:02 +08:00
int128 咯
passerbytiny
2019-11-23 15:24:57 +08:00
@nyse #7 通用方法,也就 hex dump ( 16 → 32 )和 base64 encode ( 16 →24 )了,再短就要自创方法了。
also24
2019-11-23 15:25:03 +08:00
@hdbzsgm #10
对于楼主的语境来说是

原始数据是 128bit
楼主当前使用的方式( HEX string )是 32byte -> 256bit

而 128bit 数据在 base64 之后得到的字符串是 129/3*4 = 172 bit


172bit < 256bit,所以对于楼主来说,数据确实被 『压缩』了
also24
2019-11-23 15:25:53 +08:00
@ipwx #14
emmm…… 你是不是回复错人了?
also24
2019-11-23 16:00:02 +08:00
@hdbzsgm #10
修正一下计算方式,应该是
128 / 8 = 16byte
( 16 + 2 ) / 3 * 4 = 24byte
补两个 == 之后 24 + 2 = 26byte
26 * 8 = 208 bit

208bit < 256bit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/622413

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX