t6attack
2022-08-17 04:16:40 +08:00
md5 这类散列算法,得到的字符串,其实是 16 进制数据的字符串表达。这个字符串直接占用 32 个字节,但是用来表达数据的字符却仅限 0~f 。
如果数据量放大到亿级,这种空间浪费就很巨大了。
如果允许以二进制方式存储数据,那么最简单粗暴的方式,是直接把散列字串当 hex 压入二进制数据。
比如这个 md5:a6307d508e9020d93273a7c086d9735f
字符串方式直接存储:
肉眼观察:a6307d508e9020d93273a7c086d9735f
实际存储:61 36 33 30 37 64 35 30 38 65 39 30 32 30 64 39 33 32 37 33 61 37 63 30 38 36 64 39 37 33 35 66
占用空间:32 字节
二进制方式存储:
肉眼观察:(乱码)
实际存储:a6 30 7d 50 8e 90 20 d9 32 73 a7 c0 86 d9 73 5f
占用空间:16 字节 ↑↑实际存储与 md5 一致
其他思路:
以字符串模式存储数据的情况下,让更多字符参与表达数据,提升空间利用率,缩短数据长度.
压入二进制以后再 base64 一下:
肉眼观察:pjB9UI6QINkyc6fAhtlzXw==
实际存储:70 6A 42 39 55 49 36 51 49 4E 6B 79 63 36 66 41 68 74 6C 7A 58 77 3D 3D
占用空间:24 字节
将 16 进制转换为 36 进制:
肉眼观察:2izcpdgz4p6o8rmbxptszbuqn
实际存储:32 69 7A 63 70 64 67 7A 34 70 36 6F 38 72 6D 62 78 70 74 73 7A 62 75 71 6E
占用空间:25 字节