西西河

主题:如何分摊秘密(一)——从《鹿鼎记》中的四十二章经说起 -- 明日枯荷包

共:💬63 🌺987
全看分页树展 · 主题 跟帖
家园 用string就容易些,可以做到5*30=150位编码

可以把产品码当作一个数字,比如最大的一个产品码是300999999,最小的一个产品码是002000001。

制定编码规则如下:把数字0-9,A-Z,a-z依次编码成0-61共62个码,每个数字对应一个字符,比如数字0对应字符0,数字26对应字符a。。。数字61对应字符Z

把产品码300999999除以62,得到整数XXX1和余数YYY1=43,记录YYY1;

继续把XXX1除以62,得到整数XXX2和余数YYY2,记录YYY2=52;

。。。59;

。。。22;

最后直到整数为0,余数小于62,记为YYYn=20

所以把所有余数按倒序排起来,即20,22,59,52,43。按照前面说的编码规则编成5个字符,我偷个懒就不对应了。这就是产品的编码。

解码的时候这么做:

首先把编码字符还原成0-61的数字串20,22,59,52,43。

第一个数字20,乘以62,得到ZZZ1;

第二个数字22+ZZZ1,得数再乘以62,得到ZZZ2;

第三个数字59+ZZZ2,得数再乘以62,得到ZZZ3;

第四个数字52+ZZZ3,得数再乘以62,得到ZZZ4;

第五个数字43+ZZZ4,即可得到原来的产品码300999999。

照此办理,把最小的产品码的编码计算出来。如果你的产品码都是连续的,那么有效抽法编码范围就在最小产品码与最大产品码之间,并且由于编码时是按照ASCII值的顺序,所以可以简单地用字符串比较的方法来验证随意生成的编码是否有效码了。

可惜的是你的产品码I的取值不包括0000,所以不够连续。只能先解码出产品码,再验证是否有效的产品码,如果无效的话就重新产生了。好在I取值0000的机会只有万分之一,所以在最小编码与最大编码之间随意产生的编码的有效率应该是9999/10000,成功率是很高的。考虑到有的产品码没有对应有效的产品(无效的产品码),所以只能解出产品码后再对照产品库的编码,确定这是否有效码了。

连续生成30个有效的5位产品编码,得到5×30个字符的抽取码。

+++++补充++++++

改进一下,编码规则里取消0。即用数字1-9,A-Z,a-z依次编成61个码。以后编码解码的时候都乘以或者除以61。这样产品编码长度仍然是5位,但是当只取12个产品的时候,其余30-12=18个产品码就可以用18个单独的0来表示。所以取12个产品的时候,抽取码长度是5*12+18=78位。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河