我正在为用C#编写的结帐设置代金券代码系统,我希望能够分发执行相同功能的独特优惠券,有点像产品密钥。
有没有办法生成独特的(相当短的,最好是字母数字的)字符串,以某种方式“散列”以产生相同的结果?
换句话说,我可以从定义的凭证代码开始,并获得反向散列的多个结果吗?
如果我不能很好地解释这一点,我很抱歉 - 如果需要,我可以提供更多信息。
编辑:我知道我可以使用带有预定义代码的查找表,但我想知道是否有办法自动生成这些代码以允许系统扩展容易。
答案 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)
答案 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());