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算法对有两位(相邻位?)出错的情况,检出率更高一些(目测)。

Appendable接口和(7064:1983.MOD 11-2)算法

时间: 2024-12-29 07:26:12

Appendable接口和(7064:1983.MOD 11-2)算法的相关文章

接口2014年6月11日01:11:37

1 [1]C#中的接口和类有什么异同. 2 3 不同点: 4 不能直接实例化接口. 5 接口不包含方法的实现. 6 接口可以多继承,类只能单继承. 7 类定义可在不同的源文件之间进行拆分(partial). 8 9 相同点: 10 接口.类和结构都可以从多个接口继承. 11 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员. 12 接口和类都可以包含事件.索引器.方法和属性(属性本质上是两个方法). 13 14 基础知识:接口只能定义方法(只能定义行为,不能定义实现也就是字段

c++ primer 11 泛型算法

使用泛型算法必须包含头文件#inlucde <algorithm> 标准库还定义一组泛化的算术算法,其命名习惯与泛型算法相同,包含头文件#include <numeric> find vector<int>::const_iterator result =  find(vec.begin(), vec.end(), search_value) 找到就返回指向该元素的迭代器,没找到就返回第二个迭代器实参 1 vector<string> vec = {&quo

MachineLearning入门-11(算法评估)

评估就是估计算法在预测新数据时候能达到什么程度,但这不是对算法准确度的保证. 当评估完算法模型之后,可以用整个数据集(训练数据集和评估数据集的合集)重新训练算法,生成最终的算法模型. 接下来将学习4种不同的分离数据集的方法,用来分离训练数据集和评估数据集,并用其评估算法模型: 分离训练数据集和评估数据集 K折交叉验证分离 弃一交叉验证分离 重复随机评估.训练数据集分离 分离训练数据集和评估数据集 最简单的方法就是将评估数据集和训练数据集完全分开,采用评估数据集来评估算法模型.通常将67%的数据集

通过rest接口获取自增id (twitter snowflake算法)

1.  算法介绍 参考 http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/ Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同. Sno

2018/11/29 算法时空(2) 算法导论第三章 函数的增长

渐进记号: O记号: 欧米茄记号: 注意: O记号是复杂度函数的上限, 欧米茄记号是复杂度函数的下限. 等式/不等式渐进记号: 极限的定义: 通过极限的方法, 来求复杂度函数. 当极限的值是一个大于零的函数的时候, 这说明法f(x)函数和g(x)函数的复杂度在一个数量级. 此时使用渐进符号. 此时可以使用大O记号表示渐进函数的上界, 使用欧米茄符号表示渐进函数的下界 如果极限的值等于零, 表示分母的函数增长的比分子的函数增长的更快, 此时引入小o记号, 表示g(x)的复杂度增长的非常的快, 远比

js验证身份证号码是否合规

需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 function checkIDNumber(code){ /* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址

18位身份证验证--java实现,正则表达式

简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card)(2)preg_match("/^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3}) (\d|X)?$/",$id_card)(3)preg_match("/(^\d{15}$/)|(\d{17}(?:\d|x|X)$/),$id_card) 2.复杂并且严格一些的

关于身份证号的那些事

居民身份证号码,根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 一.身份证号码的组成 1.地址码(身份证号码前六位) 表示编码对象常住户口所在县(市.镇.区)的行政区划代码.1-2位省.自治区.直辖市代码: 3-4位地级市.盟.自治州代码: 5-6位县.县级市.区代码. 关于 行政区划代码 具体的对应关

验证表单的js代码段

JS常用功能 转载自:http://blog.csdn.net/kalision/article/details/12516103 引用js文件: <script src="js/demo.js"></script> 按钮 <button type="button" class="button medium button-style1 align-btn-right" value="send" o