我需要哈希一个数字(大约22位),结果长度必须小于12个字符。它可以是数字或混合字符,并且必须是唯一的。 (输入的数字也是唯一的。)
例如,如果输入的数字是000000000000000000001,则结果应该类似于2s5As5A62s。
我查看了典型的内容,如MD5,SHA-1等,但它们可以提供很长的结果。
答案 0 :(得分:6)
您的问题的问题是输入大于输出且唯一。如果你期望一个独特的输出,它也不会发生。这背后的原因是,如果你有一个22位数字(10 ^ 22种可能性)的输入空间和一个长度为11位(16 ^ 11种可能性)的十六进制数字输出空间,你最终会得到比输出可能性。
下图显示您需要一个19个十六进制数字的输出空间和一个完美的一对一功能,否则您将经常发生碰撞(超过50%的时间)。我认为这是你不想要的,但你没有指定。
由于无法完成您的工作,我建议您重新考虑您的设计或使用校验和,例如cyclic redundancy check(CRC)。 CRC-64将产生64位输出,当使用任何base64算法编码时,将为您提供您想要的内容。这不提供像SHA-1这样的加密强度,因此不应该在与信息安全相关的任何事情中使用它。
但是,如果您能够更改标准以允许长哈希输出,那么我强烈建议您查看SHA-512,因为它将提供高质量的输出,并且复制的可能性极低。我的意思是,没有两个输入在算法历史中找到相同的哈希值。
如果这两个建议对你来说都不是很好,那么你的最后一个选择可能只是在输入数据上只使用base64。它将以最佳方式使用标准英语字母表示您的数据,从而尽可能减少字符数,同时保留输入数据的完整表示。这不是哈希函数,而只是一种编码二进制数据的方法。
答案 1 :(得分:1)
为什么不采用MD5或SHA-N然后重构BASE64(或base-whatever)并且只使用它们的12个字符? 注意:在所有情况下,哈希都不会是唯一的(但可以提供低冲突概率)
答案 2 :(得分:1)
如果哈希必须是唯一的,则不能使用哈希。
您需要大约74位来存储这样的数字。如果将其转换为base-64,则大约12个字符。
答案 3 :(得分:0)
您能详细说明您对散列的要求是什么吗?您需要确保结果是多样的吗? (即不是1 = a,2 = b)
只是大声思考,稍微横向思考,但是你不能对你的号码应用游程编码原则,将其视为你想要压缩的数据。然后,您可以使用压缩版本的base64版本。