看清楚我的需求,我不是要加密, 我拿md5举例是想表达,我需求的算法 是想把 不固定的有顺序的长度编号,通过算法变成 像md5一样 没有规律并且唯一的, 我要的不是加密算法,我是需要反向算出编号的,  

解决方案 »

  1.   

    // 也许多次异或方式即可解决你的所有问题? 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 啥的,直接从第二位开始取第一位那么多转成整数
      

  2.   

    楼主,防伪验证没有你这样做的!可逆的算法就意味着能伪造!!!
    一般来说,防伪码都是使用关键信息进行摘要hash。譬如发票上的防伪码就是客户名称、开票单位、金额、票号等关键信息进行计算。验证真伪的时候,需要把客户名称、开票单位、金额、票号等关键输入,计算出来的代码如果和防伪码相符,就是真的。
    防伪不是防别人伪造防伪码,而是防范别人伪造信息或产品
      

  3.   

    一般的程序我觉得的自定义个死的复杂字符串如"h.a1n54g88k@d&in*we",加上输入的密码,然后再md5就可以了
      

  4.   

    你确定防伪码是12-20之间纯数字?如果你没有漏掉“位”字的话,太简单了,补0完全满足你的需要foo(12, 16);foo(int input, length)
    {
        if(length<=1) throw....
        return input+ new string('0', length-input.ToString().Length);
    }
      

  5.   

    12-20个数字不重复,扯淡的事情,12-20总共才多少范围,终归会出现重复的,连Guid都不敢保证不重复,只能说理论上能重复,实际上基本不可能重复
      

  6.   


    那么你就使用 GUID 然后取其中的某字节开始连续7个字节转换为整数好了。
      

  7.   

    使用 GUID 然后取其中的某字节开始连续7个字节转换为整数  -->   使用 MD5 算法然后取其中的某字节开始连续7个字节转换为整数
      

  8.   

    去MD5值之中的7位,很显然,重复概率比MD5大无数倍。你取的数越短,那么比md5的重复概率越大,比如说从100亿倍变为1000亿倍。总之是你的这种东西的“不重复”的要求越来越不靠谱,因为你的长度短。
      

  9.   


    你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。
      

  10.   

    防伪码 是为每一件商品赋一个唯一的数码,上千家客户,所有产品数量加一起得几个亿,
    量少我直接随机固定长度的数码存到数据库,每生一个跟数据库里的比较,看是否有重复的,不重复则存入,可问题是上亿的数据这方法肯定行不通啊,所以我想到利用编号 用一种算法瞬间生产 防伪码,  所以生成的防伪码也要保证唯一。  至于为什么要反推, 因为不同编号期间是不同公司信息,比如 1-100000是公司A 信息,100000-1000000是公司B的信息, 消费者查询防伪码时 输入16位防伪码  通过公式立即反推出编号,根据编号立即获取查询出是哪家公司的信息。    否则只能在几个亿的数据里查询出对于编号,再去查询公司信息。
     上面引用错了,你这个就和身份证号码一样,叫id,id有规律,且没有保密性,不叫防伪码。 
      

  11.   

    嗯,我同意“这是id,号码本身没有保密性”的说法。所谓防伪码,就是我们查重复用的。那么用流水号或者像手机号码(每一个运营商的号段都不同)式的分配编号即可。lz 多虑了。
      

  12.   

    sdg