问题描述
设计一个生成防伪码的算法,防伪码位数可以自己选择,防伪码是12-20之间纯数字,是无规律可循的数据,需要的算法很简单,就是MD5算法一样,把有顺序的1,2,3...变成无规律的唯一的,而且位数是可选的,MD5(16)例:1:a0b923820dcc509a2:9d4c2f636f067f89...1000000:5f84d9652f1012ef我需要的算法是位数可选,不是固定16位的,第二是纯数字的,没有字母,然后可以解码公式的,通过查询后面的数码能算出前面的编号.
解决方案
解决方案二:
首先你犯了两点错误1.MD5是不能解密的2.加密算法算出的位数跟你的明文有关你给个100万长度的明文,要生成20个字节的密文,这东西能解码才有鬼
解决方案三:
引用1楼Z65443344的回复:
首先你犯了两点错误1.MD5是不能解密的2.加密算法算出的位数跟你的明文有关你给个100万长度的明文,要生成20个字节的密文,这东西能解码才有鬼
看清楚我的需求,我不是要加密,我拿md5举例是想表达,我需求的算法是想把不固定的有顺序的长度编号,通过算法变成像md5一样没有规律并且唯一的,我要的不是加密算法,我是需要反向算出编号的,
解决方案四:
我再描述下,我目的只是把编号通过算法变成没规律的,正常编号1,2,3,4,5,6,7,8,9,10,11,12......99999,100000...我只想通过算法把这有顺序的编号变成固定长度且无规律唯一的,
解决方案五:
舌头捋不直的程序员不是一个好司机。
解决方案六:
加解密好复杂啊,新人路过帮顶
解决方案七:
//也许多次异或方式即可解决你的所有问题?stringkey;//密钥stringid;//要加密的序号stringpw;//生成的密文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=33453453453453453453//先来一次类似异或,个位数相加再取整,可逆的!strings="";for(inti=0;i<20;i++)s+=((int.Parse(key.Substring(i,1))+int.Parse(pw.Substring(i,1)))%10).ToString();pw=s;//这时pw=34687910243576809132//随意吧,来一次乱序 把pw分成10块,然后逆序输出s="";for(inti=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=32918076352410796834//再来一次相加取整s="";for(inti=0;i<20;i++)s+=((int.Parse(key.Substring(i,1))+int.Parse(pw.Substring(i,1)))%10).ToString();pw=s;//可以输出pw了。你说谁还认识他。现在pw=33142533142533142513//解密过程我不写了。有key在手,怎么弄的就怎么回来。//相加取整的逆方法如下:比如4+9=13%10=3,那么逆方法就是3+10=13-4=9%10=9//最后拿到3345345345啥的,直接从第二位开始取第一位那么多转成整数
解决方案八:
能满足你要求的方法太多了。动动脑子就好。
解决方案九:
楼主,防伪验证没有你这样做的!可逆的算法就意味着能伪造!!!一般来说,防伪码都是使用关键信息进行摘要hash。譬如发票上的防伪码就是客户名称、开票单位、金额、票号等关键信息进行计算。验证真伪的时候,需要把客户名称、开票单位、金额、票号等关键输入,计算出来的代码如果和防伪码相符,就是真的。防伪不是防别人伪造防伪码,而是防范别人伪造信息或产品
解决方案十:
引用6楼hunshy的回复:
//也许多次异或方式即可解决你的所有问题?stringkey;//密钥stringid;//要加密的序号stringpw;//生成的密文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=33453453453453453453//先来一次类似异或,个位数相加再取整,可逆的!strings="";for(inti=0;i<20;i++)s+=((int.Parse(key.Substring(i,1))+int.Parse(pw.Substring(i,1)))%10).ToString();pw=s;//这时pw=34687910243576809132//随意吧,来一次乱序 把pw分成10块,然后逆序输出s="";for(inti=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=32918076352410796834//再来一次相加取整s="";for(inti=0;i<20;i++)s+=((int.Parse(key.Substring(i,1))+int.Parse(pw.Substring(i,1)))%10).ToString();pw=s;//可以输出pw了。你说谁还认识他。现在pw=33142533142533142513//解密过程我不写了。有key在手,怎么弄的就怎么回来。//相加取整的逆方法如下:比如4+9=13%10=3,那么逆方法就是3+10=13-4=9%10=9//最后拿到3345345345啥的,直接从第二位开始取第一位那么多转成整数
请问下这能否保证密码唯一性?会不会出现两个编号的密码是一样的,我要保证所有生成的密码都是唯一的,不能重复的,否则解码不知道对应哪个了
解决方案十一:
一般的程序我觉得的自定义个死的复杂字符串如"h.a1n54g88k@d&in*we",加上输入的密码,然后再md5就可以了
解决方案十二:
然后可以解码公式的,通过查询后面的数码能算出前面的编号.我要的不是加密算法,我是需要反向算出编号的你说的自相矛盾啊能通过密文反算出明文的,就叫加密除非通过密文无法反推出明文,那才是散列你既要散列,又要反推,这是干毛线啊
解决方案十三:
你确定防伪码是12-20之间纯数字?如果你没有漏掉“位”字的话,太简单了,补0完全满足你的需要foo(12,16);foo(intinput,length){if(length<=1)throw....returninput+newstring('0',length-input.ToString().Length);}
解决方案十四:
唯一性是个问题。。
解决方案十五:
12-20个数字不重复,扯淡的事情,12-20总共才多少范围,终归会出现重复的,连Guid都不敢保证不重复,只能说理论上能重复,实际上基本不可能重复
解决方案:引用3楼weblg的回复:
我再描述下,我目的只是把编号通过算法变成没规律的,正常编号1,2,3,4,5,6,7,8,9,10,11,12......99999,100000...我只想通过算法把这有顺序的编号变成固定长度且无规律唯一的,
那么你就使用GUID然后取其中的某字节开始连续7个字节转换为整数好了。
解决方案:使用GUID然后取其中的某字节开始连续7个字节转换为整数-->使用MD5算法然后取其中的某字节开始连续7个字节转换为整数
解决方案:去MD5值之中的7位,很显然,重复概率比MD5大无数倍。你取的数越短,那么比md5的重复概率越大,比如说从100亿倍变为1000亿倍。总之是你的这种东西的“不重复”的要求越来越不靠谱,因为你的长度短。
解决方案:我觉得还是这样好了:你把所有这些数字存到数据库里去有一个表,是"待取值",里面罗列出所有的20位数字,或者是一部分数字然后每来一个要转换的数字,到数据库里做随机查询,找个数字跟它匹配然后就把这两个数字存到另一个表里去,同时这个数字从"待取值"的表里移除掉这样既能保证无规律,又能保证反推,又保证不重复
解决方案:引用18楼Z65443344的回复:
我觉得还是这样好了:你把所有这些数字存到数据库里去有一个表,是"待取值",里面罗列出所有的20位数字,或者是一部分数字然后每来一个要转换的数字,到数据库里做随机查询,找个数字跟它匹配然后就把这两个数字存到另一个表里去,同时这个数字从"待取值"的表里移除掉这样既能保证无规律,又能保证反推,又保证不重复
防伪码是为每一件商品赋一个唯一的数码,上千家客户,所有产品数量加一起得几个亿,量少我直接随机固定长度的数码存到数据库,每生一个跟数据库里的比较,看是否有重复的,不重复则存入,可问题是上亿的数据这方法肯定行不通啊,所以我想到利用编号用一种算法瞬间生产防伪码,所以生成的防伪码也要保证唯一。至于为什么要反推,因为不同编号期间是不同公司信息,比如1-100000是公司A信息,100000-1000000是公司B的信息,消费者查询防伪码时输入16位防伪码通过公式立即反推出编号,根据编号立即获取查询出是哪家公司的信息。否则只能在几个亿的数据里查询出对于编号,再去查询公司信息。
解决方案:引用9楼weblg的回复:
请问下这能否保证密码唯一性?会不会出现两个编号的密码是一样的,我要保证所有生成的密码都是唯一的,不能重复的,否则解码不知道对应哪个了
可逆的算法一定是唯一的。前题条件是你的密钥是固定的。。同一个序号使用两个不同的密钥肯定得到两个不同的密文。当然理论上来说,同一条密文使用两个不同的密钥当然可以解得不同的两条序号,只是机率较小。
解决方案:我的方法在细节上当然还需要改进一下。比如11111111111和1这两个序号第一步都会解得11111111111111111111如果实际应用的时候要考虑加一个校验。或者别的方式。
解决方案:引用19楼weblg的回复:
Quote: 引用18楼Z65443344的回复:
我觉得还是这样好了:你把所有这些数字存到数据库里去有一个表,是"待取值",里面罗列出所有的20位数字,或者是一部分数字然后每来一个要转换的数字,到数据库里做随机查询,找个数字跟它匹配然后就把这两个数字存到另一个表里去,同时这个数字从"待取值"的表里移除掉这样既能保证无规律,又能保证反推,又保证不重复防伪码是为每一件商品赋一个唯一的数码,上千家客户,所有产品数量加一起得几个亿,量少我直接随机固定长度的数码存到数据库,每生一个跟数据库里的比较,看是否有重复的,不重复则存入,可问题是上亿的数据这方法肯定行不通啊,所以我想到利用编号用一种算法瞬间生产防伪码,所以生成的防伪码也要保证唯一。至于为什么要反推,因为不同编号期间是不同公司信息,比如1-100000是公司A信息,100000-1000000是公司B的信息,消费者查询防伪码时输入16位防伪码通过公式立即反推出编号,根据编号立即获取查询出是哪家公司的信息。否则只能在几个亿的数据里查询出对于编号,再去查询公司信息。
所谓防伪码,必然是要记录到数据库里去,否则根本起不到"防伪"的目的
解决方案:引用8楼xuanbg的回复:
楼主,防伪验证没有你这样做的!可逆的算法就意味着能伪造!!!一般来说,防伪码都是使用关键信息进行摘要hash。譬如发票上的防伪码就是客户名称、开票单位、金额、票号等关键信息进行计算。验证真伪的时候,需要把客户名称、开票单位、金额、票号等关键输入,计算出来的代码如果和防伪码相符,就是真的。防伪不是防别人伪造防伪码,而是防范别人伪造信息或产品
8楼靠谱。
解决方案:引用2楼weblg的回复:
Quote: 引用1楼Z65443344的回复:
首先你犯了两点错误1.MD5是不能解密的2.加密算法算出的位数跟你的明文有关你给个100万长度的明文,要生成20个字节的密文,这东西能解码才有鬼看清楚我的需求,我不是要加密,我拿md5举例是想表达,我需求的算法是想把不固定的有顺序的长度编号,通过算法变成像md5一样没有规律并且唯一的,我要的不是加密算法,我是需要反向算出编号的,
你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。
解决方案:引用19楼weblg的回复:
Quote: 引用18楼Z65443344的回复:
我觉得还是这样好了:你把所有这些数字存到数据库里去有一个表,是"待取值",里面罗列出所有的20位数字,或者是一部分数字然后每来一个要转换的数字,到数据库里做随机查询,找个数字跟它匹配然后就把这两个数字存到另一个表里去,同时这个数字从"待取值"的表里移除掉这样既能保证无规律,又能保证反推,又保证不重复防伪码是为每一件商品赋一个唯一的数码,上千家客户,所有产品数量加一起得几个亿,量少我直接随机固定长度的数码存到数据库,每生一个跟数据库里的比较,看是否有重复的,不重复则存入,可问题是上亿的数据这方法肯定行不通啊,所以我想到利用编号用一种算法瞬间生产防伪码,所以生成的防伪码也要保证唯一。至于为什么要反推,因为不同编号期间是不同公司信息,比如1-100000是公司A信息,100000-1000000是公司B的信息,消费者查询防伪码时输入16位防伪码通过公式立即反推出编号,根据编号立即获取查询出是哪家公司的信息。否则只能在几个亿的数据里查询出对于编号,再去查询公司信息。
上面引用错了,你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。
解决方案:虽然看不懂,顶一下
解决方案:嗯,我同意“这是id,号码本身没有保密性”的说法。所谓防伪码,就是我们查重复用的。那么用流水号或者像手机号码(每一个运营商的号段都不同)式的分配编号即可。lz多虑了。
解决方案:没有什么直接的计算方法保证“无规律可循”且“永不重复”,如果号码才十几位整数,更不可能。
解决方案:sdg
解决方案:记得好像MD5无损压缩为19位数字,有这么一个东西,你搜一下。
解决方案:写个序列就可以保证不重复