我需要哈希一个数字(约22位数字),结果长度必须少于12个字符。它可以是数字或字符的混合,并且必须是唯一的。 (输入的数字也将是唯一的)。

例如,如果输入的数字是000000000000000000001,则结果应类似于2s5As5A62s。

我查看了典型的数据,例如MD5,SHA-1等,但是它们给出了很长的结果。

最佳答案

您的问题是输入大于输出且唯一。如果您还期望获得唯一的输出,则不会发生。其背后的原因是,如果输入空间为22个数字(10 ^ 22种可能性),而十六进制数字的输出空间为11位数字(16 ^ 11种可能性),那么最终得到的输入可能性比输出的可能性。

下图显示,您需要一个输出空间为19个十六进制数字和一个完美的一对一功能,否则您将经常发生冲突(超过50%的时间)。我认为这是您不想要的,但您未指定。



由于无法完成您想要的操作,因此建议您重新考虑设计或使用校验和,例如cyclic redundancy check(CRC)。 CRC-64将产生64位输出,并使用任何base64算法进行编码时,将为您提供所需的内容。这不能提供像SHA-1一样的加密强度,因此永远不要在与信息安全相关的任何事物中使用它。

但是,如果您能够更改标准以允许较长的散列输出,那么我强烈建议您查看SHA-512,因为它将提供高质量的输出,而重复的机会极低。我的几率很小,是指在算法的历史中尚未发现两个输入等于相同的哈希值。

如果这两个建议仍然都不适合您,那么您的最后一个选择可能就是仅对输入数据使用base64。它实际上将以最佳的方式利用标准的英语字母来表示您的数据,从而在保留输入数据的完整表示的同时,尽可能地减少字符数。这不是哈希函数,而仅仅是一种编码二进制数据的方法。

关于c# - 散列函数以获得有限的长度结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10216488/

10-13 05:56
查看更多