求算法高手帮忙 看清楚我的需求,我不是要加密, 我拿md5举例是想表达,我需求的算法 是想把 不固定的有顺序的长度编号,通过算法变成 像md5一样 没有规律并且唯一的, 我要的不是加密算法,我是需要反向算出编号的, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 也许多次异或方式即可解决你的所有问题? string key; // 密钥 string id; // 要加密的序号 string pw; // 生成的密文 key = "01234567890123456789"; // 这是20位的,,当然你可以使用任意位数的随机码。 // 直接生成一个GUID转成10进制取其中的几位当密钥好了。这不重要。 id = "345"; // 这里以加密345为例 pw = (id.Length + id + id + id + id + id + id + id +id + id + id + id + id + id + id + id + id + id+ id).Substring(0,20); // 这时pw = 33453 45345 34534 53453 // 先来一次类似异或,个位数相加再取整,可逆的! string s = ""; for (int i = 0; i < 20; i++) s += ((int.Parse(key.Substring(i, 1)) + int.Parse(pw.Substring(i, 1))) % 10).ToString(); pw = s; // 这时pw = 34687 91024 35768 09132 // 随意吧,来一次乱序 把pw分成10块,然后逆序输出 s = ""; for (int i = 0; i < 20; i += 2) s = (pw.Length - i < 2) ? pw.Substring(i, pw.Length - i) + s : pw.Substring(i, 2) + s; pw = s; // 这时pw = 32918 07635 24107 96834 // 再来一次相加取整 s = ""; for (int i = 0; i < 20; i++) s += ((int.Parse(key.Substring(i, 1)) + int.Parse(pw.Substring(i, 1))) % 10).ToString(); pw = s; // 可以输出pw了。你说谁还认识他。现在pw = 33142 53314 25331 42513 // 解密过程我不写了。有key在手,怎么弄的就怎么回来。 // 相加取整的逆方法如下:比如4 + 9 = 13 % 10 = 3,那么逆方法就是 3 + 10 = 13 - 4 = 9 % 10 = 9 // 最后拿到3345345345 啥的,直接从第二位开始取第一位那么多转成整数 楼主,防伪验证没有你这样做的!可逆的算法就意味着能伪造!!!一般来说,防伪码都是使用关键信息进行摘要hash。譬如发票上的防伪码就是客户名称、开票单位、金额、票号等关键信息进行计算。验证真伪的时候,需要把客户名称、开票单位、金额、票号等关键输入,计算出来的代码如果和防伪码相符,就是真的。防伪不是防别人伪造防伪码,而是防范别人伪造信息或产品 一般的程序我觉得的自定义个死的复杂字符串如"h.a1n54g88k@d&in*we",加上输入的密码,然后再md5就可以了 你确定防伪码是12-20之间纯数字?如果你没有漏掉“位”字的话,太简单了,补0完全满足你的需要foo(12, 16);foo(int input, length){ if(length<=1) throw.... return input+ new string('0', length-input.ToString().Length);} 12-20个数字不重复,扯淡的事情,12-20总共才多少范围,终归会出现重复的,连Guid都不敢保证不重复,只能说理论上能重复,实际上基本不可能重复 那么你就使用 GUID 然后取其中的某字节开始连续7个字节转换为整数好了。 使用 GUID 然后取其中的某字节开始连续7个字节转换为整数 --> 使用 MD5 算法然后取其中的某字节开始连续7个字节转换为整数 去MD5值之中的7位,很显然,重复概率比MD5大无数倍。你取的数越短,那么比md5的重复概率越大,比如说从100亿倍变为1000亿倍。总之是你的这种东西的“不重复”的要求越来越不靠谱,因为你的长度短。 你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。 防伪码 是为每一件商品赋一个唯一的数码,上千家客户,所有产品数量加一起得几个亿,量少我直接随机固定长度的数码存到数据库,每生一个跟数据库里的比较,看是否有重复的,不重复则存入,可问题是上亿的数据这方法肯定行不通啊,所以我想到利用编号 用一种算法瞬间生产 防伪码, 所以生成的防伪码也要保证唯一。 至于为什么要反推, 因为不同编号期间是不同公司信息,比如 1-100000是公司A 信息,100000-1000000是公司B的信息, 消费者查询防伪码时 输入16位防伪码 通过公式立即反推出编号,根据编号立即获取查询出是哪家公司的信息。 否则只能在几个亿的数据里查询出对于编号,再去查询公司信息。 上面引用错了,你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。 嗯,我同意“这是id,号码本身没有保密性”的说法。所谓防伪码,就是我们查重复用的。那么用流水号或者像手机号码(每一个运营商的号段都不同)式的分配编号即可。lz 多虑了。 sdg 用EPSON ESC/POS指令写pos打印机程序 请问后台线程是否会被父线程消灭? 静态类多线程使用是否会冲突? 请教ASP关于SendBinary的问题 跪求高手指点 数据库统计问题 Thread问题 打听一下WEB里怎么实现dateTimePicker呀 C#内存消耗问题 MSM文件使用方法 跪求c#实现图片裁剪框,并能拖动,调整大小。。 服务端与客户端通信
string id; // 要加密的序号
string pw; // 生成的密文 key = "01234567890123456789";
// 这是20位的,,当然你可以使用任意位数的随机码。
// 直接生成一个GUID转成10进制取其中的几位当密钥好了。这不重要。
id = "345"; // 这里以加密345为例
pw = (id.Length + id + id + id + id + id + id + id +id + id + id + id + id + id + id + id + id + id+ id).Substring(0,20);
// 这时pw = 33453 45345 34534 53453 // 先来一次类似异或,个位数相加再取整,可逆的!
string s = "";
for (int i = 0; i < 20; i++) s += ((int.Parse(key.Substring(i, 1)) + int.Parse(pw.Substring(i, 1))) % 10).ToString();
pw = s;
// 这时pw = 34687 91024 35768 09132 // 随意吧,来一次乱序 把pw分成10块,然后逆序输出
s = "";
for (int i = 0; i < 20; i += 2) s = (pw.Length - i < 2) ? pw.Substring(i, pw.Length - i) + s : pw.Substring(i, 2) + s;
pw = s; // 这时pw = 32918 07635 24107 96834 // 再来一次相加取整
s = "";
for (int i = 0; i < 20; i++) s += ((int.Parse(key.Substring(i, 1)) + int.Parse(pw.Substring(i, 1))) % 10).ToString();
pw = s; // 可以输出pw了。你说谁还认识他。现在pw = 33142 53314 25331 42513 // 解密过程我不写了。有key在手,怎么弄的就怎么回来。
// 相加取整的逆方法如下:比如4 + 9 = 13 % 10 = 3,那么逆方法就是 3 + 10 = 13 - 4 = 9 % 10 = 9
// 最后拿到3345345345 啥的,直接从第二位开始取第一位那么多转成整数
一般来说,防伪码都是使用关键信息进行摘要hash。譬如发票上的防伪码就是客户名称、开票单位、金额、票号等关键信息进行计算。验证真伪的时候,需要把客户名称、开票单位、金额、票号等关键输入,计算出来的代码如果和防伪码相符,就是真的。
防伪不是防别人伪造防伪码,而是防范别人伪造信息或产品
{
if(length<=1) throw....
return input+ new string('0', length-input.ToString().Length);
}
那么你就使用 GUID 然后取其中的某字节开始连续7个字节转换为整数好了。
你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。
量少我直接随机固定长度的数码存到数据库,每生一个跟数据库里的比较,看是否有重复的,不重复则存入,可问题是上亿的数据这方法肯定行不通啊,所以我想到利用编号 用一种算法瞬间生产 防伪码, 所以生成的防伪码也要保证唯一。 至于为什么要反推, 因为不同编号期间是不同公司信息,比如 1-100000是公司A 信息,100000-1000000是公司B的信息, 消费者查询防伪码时 输入16位防伪码 通过公式立即反推出编号,根据编号立即获取查询出是哪家公司的信息。 否则只能在几个亿的数据里查询出对于编号,再去查询公司信息。
上面引用错了,你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。