Hash 对哈希进行编码以适应更少的空间

Hash 对哈希进行编码以适应更少的空间,hash,compression,Hash,Compression,我能得到的最小哈希值是多少,而不会使事物过度冲突?我想一个很好的例子是散列“foo” 是否还有其他标准,如Base64,使用unicode字符?可能包括上/下umlaut字符,如Ü和ü,以便在每个字符中包含更多位?理想情况下,我希望将sha1哈希压缩为4-6个unicode字符,我可以将其粘贴到URL上。可逆地编码哈希不会影响冲突率。。。除非您的编码导致一些数据丢失(那么它就不再是可逆的) Base64和其他都是可逆的。您的第一个输出是十六进制(或base16)表示,效率为50%。Base64实

我能得到的最小哈希值是多少,而不会使事物过度冲突?我想一个很好的例子是散列“foo”


是否还有其他标准,如Base64,使用unicode字符?可能包括上/下umlaut字符,如Ü和ü,以便在每个字符中包含更多位?理想情况下,我希望将sha1哈希压缩为4-6个unicode字符,我可以将其粘贴到URL上。

可逆地编码哈希不会影响冲突率。。。除非您的编码导致一些数据丢失(那么它就不再是可逆的)

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

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

即使您发现这样一种使用unicode的高效1编码方案,也不能真正将其用作URL。为了符合标准,您应该对URL使用%编码。许多浏览器会自动转换这些字符,因此您可能会觉得这是可以接受的,但您经常使用的许多字符都不是人类可读的,而且更多的字符似乎使用不同的语言

此时,如果您确实需要短URL,您应该重新考虑使用哈希值,而是实现您自己的标识服务(例如,为每个页面或资源分配一个增量ID,这是公认的难以扩展的),或者使用另一个


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

注意,您可以安全地截断加密哈希。你必须计算一下,看看它是否仍然有足够的抵抗力,但除此之外,这样做没有问题。例如,128位仍然与GUID相同,GUID被认为不冲突。
input = foo
sha1 = 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
sha1 + b64 = C+7Hteo/D9vJXQ3UfzxbwnXaijM