我正在为用 C# 编写的结账设置一个优惠券代码系统,我希望能够分发做同样事情的独特优惠券,有点像产品密钥。
有没有办法生成唯一的(相当短,最好是字母数字)字符串,这些字符串将以某种方式“散列”以给出相同的结果?
换句话说,我可以从定义的凭证代码开始并获得多个反向哈希结果吗?
如果我没有很好地解释这一点,我很抱歉 - 如果需要,我可以提供更多信息。
编辑:我知道我可以使用带有预定义代码的查找表,但我想知道是否有一种方法可以自动生成这些代码以允许系统轻松扩展。
这里有一个想法...
使用一些秘密密码开始:“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->1000 个 md5 的部分键......干杯!
您可以使用通过当前日期/时间生成的哈希
<!-- 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());