散列不同的字符串到相同的结果

时间:2012-11-12 11:52:59

标签: string hash

我正在为用C#编写的结帐设置代金券代码系统,我希望能够分发执行相同功能的独特优惠券,有点像产品密钥。

有没有办法生成独特的(相当短的,最好是字母数字的)字符串,以某种方式“散列”以产生相同的结果?

换句话说,我可以从定义的凭证代码开始,并获得反向散列的多个结果吗?

如果我不能很好地解释这一点,我很抱歉 - 如果需要,我可以提供更多信息。

编辑:我知道我可以使用带有预定义代码的查找表,但我想知道是否有办法自动生成这些代码以允许系统扩展容易。

3 个答案:

答案 0 :(得分:3)

这是一个想法......

启动一些密码:“100:mypass:yourpass”

然后md5:你会得到

md5("10:mypass:yourpass")=f6ff5421b31e609c7dcd19c4a462caa0

'key 1'=>  left 16 chars of md5 = 'f6ff5421b31e60'

  run the right 16 chars of the md5 it into another md5:

md5('7dcd19c4a462caa0') = 582fbfb7a035d08094cdef57d88f720e

'key 2' => '582fbfb7a035d080'

[repeat again here, and again... and again, ]

...

不确定此处的“分发”点,例如如果它将在POS型礼品卡或凭证卡系统上运行或者是什么,但如果您注意到我将3个组件放入“密码”,则此值可以包含合法密钥总数(拆分为“:”导致100个有效密钥中断,系统(分发服务器)密码和本地系统密码,这些密码需要在“正确”密钥上“验证”或“匹配”。您可以快速扫描以查看密钥是否存在,并在本地编写失效例程。我知道,我的数学天才朋友可能会说有更好,更安全和有效的方式,但是嘿......这就是你要求的权利吗?我是一个简单的人,喜欢简单的东西......但是你也可以通过允许范围来使它变得更复杂...... 例如pass=> "100:1000:pass1:pass2"这样你可以测试100-> 1000th md5的部分键... 干杯!!

答案 1 :(得分:1)

您要找的是Perfect hash function

Here你可以找到一篇关于如何有效地为大型密钥集生成完美哈希的文章。

here你可以找到一个c#最小完美哈希函数生成器。

答案 2 :(得分:0)

您可以使用通过当前日期/时间生成的哈希

<!-- language: c# -->
byte[] ByteArray = Encoding.UTF8.GetBytes(System.DateTime.Now.ToString());
MD5 md5 = MD5.Create();
byte[] ByteResult = md5.ComputeHash(ByteArray);
StringBuilder result = new StringBuilder(ByteResult.Length * 2);
for (int i = 0; i < ByteResult.Length; i++)
    result.Append(ByteResult[i].ToString("X2"));
Console.WriteLine(result.ToString());