对哈希进行编码以适应 less space

Encoding a hash to fit in less space

在不过度碰撞的情况下,我可以获得的最小哈希值是多少?我认为一个很好的例子是散列 "foo".

input = foo
sha1 = 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
sha1 + b64 = C+7Hteo/D9vJXQ3UfzxbwnXaijM

是否有任何其他标准(如 Base64)使用 unicode 字符?可能包括 upper/lower 个元音变音字符,例如 Ü 和 ü 以在每个字符中包含更多位?理想情况下,我喜欢将 sha1 哈希压缩为 4-6 个 unicode 字符,我可以将其附加到 URL.

对哈希进行可逆编码不会影响冲突率...除非您的编码导致一些数据丢失(然后它不再是可逆的)。

Base64 和其他 binary-to-text encoding schemes 都是可逆的。您的第一个输出是十六进制(或 base16)表示,效率为 50%。 Base64 实现了 75% 的效率,这意味着它将 40 个字符的十六进制表示减少到 28 个字符。

最高效的二进制编码方案是yEnc,它的效率达到了 98%,这意味着使用 yEnc 编码时,100 字节长的输入将大约为 102 字节。这就是您遇到真正问题的地方:SHA-1 输出的长度为 160 位(20 字节)。如果您通过使用每个 2 字节的 UTF16 字符实现 200% 的字符字节效率,您仍然需要查看 10 个字符。您无法实现这一点,因为从 U+D7FF 到 U+E000 的 2 字节值不是有效的 UTF16 字符。这些字节值保留为更高平面字符的前缀。

即使您找到使用 unicode 的超高效1 编码方案,您也不能真正将它们用作 URL。 Unicode characters are forbidden from URLs 为了符合标准,您应该为您的网址使用 % 编码。许多浏览器会自动转换它们,因此您可能会觉得这是可以接受的,但是您经常使用的许多字符人类无法阅读,而且更多的字符似乎使用不同的语言。

在这一点上,如果您确实需要 URL,您应该重新考虑使用哈希值并改为实施您自己的身份服务(例如,为每个页面或资源分配一个增量 ID ,这无疑很难扩展)或利用另一个 link-shortening service.

1:从位的角度来看这是不可能的。 Unicode 可以实现更高的字符位比,但 Unicode 字符本身是由多个字节表示的。 UTF8 的 % 编码,大多数浏览器将其用作无法识别编码的默认值,很快就会变得混乱。