首页 > 代码库 > Appendable接口和(7064:1983.MOD 11-2)算法
Appendable接口和(7064:1983.MOD 11-2)算法
1 Appendable接口
如果某个类的实例打算接收取自 Formatter
的格式化输出,那么该类必须实现 Appendable 接口。
java.lang的StringBuffer、StringBuilder实现了该接口。
格式化主要用在文本输出方面,比如,数字、日期、金额等。
2 7064:1983.MOD 11-2算法
以下可以说明为什么身份证校验码里非得有X。
该算法的主要应用有身份证校验码。校验码通常是一组数字的最后一位,由前面的数字通过某种运算得出,用以检验该组数字的正确性。身份证校验码的作用即是对身份证的前17位数字进行运算得到第18位,以初步检验该组数字正确性。
该算法函数的构造方式为mod((2^(i-1) * ai), 11),这个i是身份证17位数据从左到右的编号,从1~17。sigma(xi)表示x1+x2+……+x17。
这里和这个算法的具体结果可能不一样,i的编排方式,计算结果后模取反(如5%11=5,取反后(12-5)%11 = 7)等,忽略这些差别。
这样做的放,校验码对17位的其中一位出错是可以校验出来的,对两位非同样位置的错误也是可以校验出来的,对三位以上的某些,是可以校验出来的。由于一位出错的概率要远远高于二位再远远远高于三位,所以该算法的校验能力应该是非常强的(除非故意设计)。
所以该算法最后一位增加了X,使校验的能力增加到11和身份证的位数17没有关系,而是和每一位的进制有关系。即如果每一位数字范围是0~6,校验码就是0~7了。
当然,这里还有一点问题,如果跟进制有关,0~9也只需要10种标识来区别,校验码表示的可能值至少为10,而不是11。这是由于校验码的可能性为10时,和取模可能会有问题,a1为奇数,结果就为奇数。这是和其基底2相关的,也就是说校验码的可能值个数与基底应该是正交的。这应该就是算法名中11-2的含义。
据此,我们可以构造一个10-3算法,这样,身份证上就不必要有X了。但与11-2相比,10-3有一个劣势:目前内存数据按2进制存放,11-2算法对有两位(相邻位?)出错的情况,检出率更高一些(目测)。