简介
校验位是字母数字字符添加到一个编号,检测错误。校验位是一个简单易用的方式,nuetralize密钥数据的人为因素引入的错误。检查数字不纠错码。如果读者要调查强大的纠错码,他或她被称为由彼得森和韦尔登。
这也是notebale,CRC码校验位的计划,因为产生了一个以上的字母数字数字是检测错误。如果读者希望有一个很长的数据集或二进制数据集的系统,可以考虑使用32位CRC,阿德勒校验,或基于哈希校验。阿德勒校验类似一个冗余校验,可靠性交易速度。 散列应用程序的一个示例使用的CRC32,MD4,MD5,RIPEMD - 160,SHA - 1,惠而浦,和SHA - 2的哈希家庭。
本文将讨论以下校验位的计划:国防部9计划国防部7计划国防部11计划3,减肥方法IBM公司计划刚果爱国者联盟计划Verhoeff算​​法ISO 7064 MOD N / N - 1
此外,集团理论的表面处理提出以下的算法。常见错误
据理查德海明,两个最常见的错误是:12变成21(相邻的字符是换位)112变成122(三元不正确一倍)
雅各Verhoeff十进制代码中的错误检测的后续stastics:错误概约百分比评论#8594; B60% - 90%单个错误 AB#8594; AAB10% - 20%添加一个数字AAB#8594; AB10% - 20%省略数字AB#8594; BA10% - 20%换位错误AA#8594; BB0.5% - 1.5%双人错误ACB#8594; BCAGT; 1%跳转双人错误13#8594; 300.5% - 1.5%注音错误(类似的发音)下载
有5下载本文。他们在文章的结尾。国防部9计划
国防部9系统是由美国邮政汇票服务。如果汇票号码是123456789,C = 0,汇票上印的电话号码是1234567890。该系统是C = N 9%。这个系统也被称为"铸造出九"。铸造出花枝招展患有0#8594的事实,9日和9#8594; 0不检测;没有换位检测到错误(除非它invlolves校验位)。国防部7计划
一个比铸造出花枝招展更强大的系统是一个模7系统。 Bressoud和旅行车证明以下内容:单个错误检出率93.81%换位错误检出率93.87%
国防部9计划类似,C = N%7。然而,只有3换位的错误是检测不到的:70#8596; 07,81#8596; 18日和92#8596; 29。国防部11计划
国防部11计划是一个加权计划又称国际标准图书编号(ISBN)。第9位代表的唯一标识符,第十位是校验位。该计划自11 MOD,校验位0-9或X
这个mod 11为基础的系统运行(即个人数字数n)上的一个点的产品。 N??(10,9,...,2,1)MOD 10。换句话说,让AI N(最显着的至少显著)的第i个数字。然后
C = 10a1 9A2 8a3 7a4 6a5 5a6 4a7 3a8 2a9 MOD 11
第10届(A10)数字会- C,所以下列公式(称为检查方程)成立。
0 = 10a1 9A2 8a3 7a4 6a5 5a6 4a7 3a8 2a9 1A10 MOD 11
这个计划检测到所有单一错误,并在任何距离(假设的总人数是10位或更少位长)的任意两个数字换位。
{S0}

// Check Digit Sample 3
_tstring number = _T("073560753"); // c should be 2
_tcout << _T("ISBN: ") << number << endl;
int i = 10, c = 0;
for( _tstring::const_iterator it  = number.begin();
                              it != number.end(); i--, it++ )
{
    if( _T('X') == *it )
        { c += 10 * i; }
    else
        { c += CharToNumber( *it ) * i; }
    c %= 11;        
}
    
// a_10 = -c
c = 11 - c;
if( 10 == c )
    { _tcout << _T("Check digit is: ") << _T("X") << endl; }
else
    { _tcout << _T("Check digit is: ") << c << endl; }
3,减肥方法
3重量的方法也被称为电子转帐路由号码银行业计划。这是一个模10的系统,但N工作作为一个整体的数量,而不是一个点的产品经营(即个别数字,数字n)。
因此,一个8位的路由数量,校验位彗星= N??(7,3,9,7,3,9,7,3),MOD 10。换句话说,让AI N(最显着的至少显著)的第i个数字。然后
C = 7A1 3A2 9a3 7a4 3A5 9a6 7a7 3a8 MOD 10
C然后8位路线连接在一起,形成一个9位数的路由号码
这个计划是基于10乘法模产生的10位十进制数字的排列,如果是一个集合{1,3,7,9}两位数的乘法因子,但只有一部分十进制数字如果该系数是5或偶数。该系统无法检测到相邻的5个不同的数字换位。
3重量法不使用简单的模块化减少,所以C = 10 - C是不需要​​持有的平等。
读者应该发现以下检查方程成立(其中A9 - C):
0 = 7A1 3A2 9a3 7a4 3A5 9a6 7a7 3a8 A9 MOD 10
3重量计划介绍如下。正如读者可以看到,它推广到任意长度的数字容易。但是,如果读者的欲望很长的数据集,或二进制数据集系统考虑使用一个CRC或桤木校验,或基于哈希校验。
{S1}{C}IBM校验位计划
IBM的检查数字的计划是尽可能接近一个完美的系统以上的整数字段(Z)的工作时,可以得到的。这个计划是由公司,如万事达卡和维萨卡,和加拿大的社会保险号码。该系统也被称为LUHN的算法。该计划将检测所有单错误,和所有的换位错误,除0#8596; 9。
校验位C是点积定义为:
- (A1,A2,A3,A4,...,AN - 1,)(2,1,2,1,...,1,2) - ??R(MOD 10)
r是奇数索引数字大于5。这意味着R = R 1当且仅当AI GT; 5,在那里我是奇数。
在实践中,该算法是完全不同的实施。
{S2}
// Check Digit Sample 4
int i = 1, c = 0;
for( _tstring::reverse_iterator it  = number.rbegin();
                                it != number.rend(); it++, i++)
{
    if( 0 == i % 2 )
    { 
        // Add even indexes
        c += CharToNumber( *it );
    }
    else
    {
        // Cast Out Nines on the odd indexed digits
        //   after multiplying by 2
        int t = 2 * CharToNumber( *it );
        if( t > 9 ) t -= 9;  // mod 9
        c += t;
    }        
}
刚果爱国者联盟计划
的通用产品代码系统是类似IBM的系统,除了重量3甚至索引数字。实现留给读者作为练习。Verhoeff算​​法
与以前exmamined的方法(环Z)不同,Verhoeff的算法工作二面角组D5。
该算法是在爱尔兰共和国的ESB网络等公司使用。该算法是完美的,在它检测到的所有单的错误和所有换位错误。此外,它检测到大多数(但不是所有)的双子错误,跳双人错误,跳转换位错误(ABC#8594; CBA),和注音错误。
Verhorff的观察是如下:之一可以使用的10对称性,以编码使用的身份为0的10位数;旋转(按顺序)1,2,3,4;和反射为5,6, 7,8,9。
在准备实施的最后一步是确定的数字的排列。
让#948;数字排列如下:#948;不执行0改造#948;开关1和4#948;开关2和3#948;循环置换5,8,6,9,7
#948;(0)= 0
#948;(1)= 4
#948;(4)= 1
#948;(2)= 3
#948; (3)= 2
#948;(5)= 8
#948;(8)= 6
#948;(6)9 =
#948;(9)= 7 { BR}#948(7)= 5;
Ž不同,D5是不是communative:8 7#8800; 7 8???。
??/ P> 0 1234567800123456789112 3 40678952340178 9 563340128956744 012395678 559876043216659 8 7104327659821043887659 3 21049986543210
读者应该认识到,D5是一个复杂的实体(功能失调),其元素从0到9的整数,有点随意映射和集团化运作,是不是都喜欢的加法或乘法。此外,还有没有D5的概念:LT和GT;没有任何意义。乘以元素时,该表的红色阴影表示Communative财产的损失。
{S3}
一个小题外话:??一个愿望来执行6 1,首先找到第6行,然后在第一列。 6??1 = 5。C = 948; N(A1)#948;??N - 1(A2)#948;??N - 2(A2)???... ?#948;??2(1)#948;()
因此,编码1793,读者会:
C =#948; 4(1)#948;???3(7)#948; 2(9)#948;??1(3)

#948 4(1)=#948; 3(4)=#948; 2(1)=#948; 1(4)= 1
#948; 3(7)=#948; 2(5)= #948; 1(8)= 6
#948; 2(9)=#948; 1(7)= 5
#948; 1(3)= 2
1??6??5??
(1??(6??(5??2))2)= 4
至于其他的例子,4的倒数是必需的,以便检查方程成立。因此,校验位等于1(1??4 = 0)。
下面是背道而驰1000372996 checkdigit5的结果。由于乘法,置换,逆表,代码是很容易的。注意,C是不再从前一阶段的一笔 - 它是用来作为一个查找,然后有效地丢弃。
{S4}的
// Check Digit 5
// skip i = 0 - it is the checkdigit
//  (which is being calculated)
int i = 1, c = 0;
for( _tstring::reverse_iterator it  = number.rbegin();
                                it != number.rend(); it++, i++)
{
    // c = M[ c ][ P[ i % 8 ][ CharToNumber( *it ) ]];
    unsigned int n = CharToNumber( *it );
    unsigned int p = P[ i % 8 ][ n ];
                 c = M[ c ][ p ];        
     
}
c = Inv[ c ];
ISO 7064 MOD N / N - 1
本节提供了一个校验位家庭的概述。在下载Implemetations。
ISO规范是专为以下字母:数字(10位数字:0到9)字母(26个字母:A到Z)字母或数字(字母和数字)
ISO规范旨在检测以下():所有单替代错误(另一个替代单个字符,例如为1234 4234);所有或几乎所有的单(本地)换位错误(两个单个字符的换位,无论是相邻或与它们之间的一个字符,例如12354或12345 12543);所有或几乎所有的移位错误(向左或向右的整串的变化);高比例的双取代错误(在相同的字符串替换两个独立的单错误,例如7234587,1234567);高比例的所有其他错误。
评论国防部10/11欧洲血库,
人独特的标识符(美国国立卫生研究院)国防部16/17 欧洲银行路由国防部36/37美牲畜识别群论
一组是一组对象和相关的操作。组用于日常生活。例如,计算在一个房间里的人。该集团是在整数和操作此外,记。有可以执行的其他操作,如乘法,记为X。
此外,有一个标识元素:0。这提供了预期的结果:1 0 = 1,0 1 = 1,等下乘法,identity元素为1。同样是真正的乘法:1 × 1 = 1,5 × 1 = 5,等等。
正如人们可以在整数操作,操作可以执行超过D5的。将被定义为如下的操作。
{五}
的第一个操作,将被定义为#961;这是希腊字母RHO,并表示在D5的旋转。 #961; 0的下旋转的身份元素,因为它离开元素不变。 #961; 1旋转二面角72?? #961;旋转二面角144??最后,#961; 5 =#961; 0。
{中六}
接下来的操作,将被定义为#963;这是希腊字母西格玛。因此,在字母表中的Rho。这将是用来表示操作反射。 #963; 0叶的元素不变,而#963; 1"翻转"的元素超过它的横轴。所以#963; 2 =#963; 0。敏锐的读者应该认识到#961; 5 =#963; 2。
{七}
为了直观的观察,二面角的分区如下。
{S8}
现在,执行对元素的操作。例如,#961; 7#963; 5。 #961; 7 =#961; 2,所以:
{S9}
和明年,#963; 5 =#963; 1:

最后的可视化表示如下图所示。请注意,这是作为一种视觉演示给用户。这并不意味着直观地展示Verhoeff的算法。绿色表示分区2的新位置。
{S11}摘要
虽然提出一个完善的检测数字系统,学术界提供更。在1978年不平凡的纸,塞西,五拉贾拉曼,和PS Kenjale形容为一个检查系统,可用于纠正任何单个错误或换位错误。值得注意的是,系统的需要,而不是一个两个校验位,只适用于某些基地的有效。
鼓励读者访问错误检测十进制数字,瓦格纳和推杆的经验,在发展商业邮购房子的数字系统检查(包括本文)。下载修订2007年7月27日固定的语法错误2007年6月19日删除样品1饲料2007年6月2日返工简介2007年2月6日上架的"常见错误"节2007年4月17日清理格式化二○○六年十二月十九日添加参考{A}12.10.2006新增ISO 7064材料二○○六年十二月九日更新的范例Verhoeff(扩大手工计算)2006年11月26日初步发布

回答

评论会员:LongRoad 时间:2011/12/07
我的应用程序的权利checkdigit的创造者,这是我一直在寻找什么最详细的解释。
谢谢。
我Verhoeff,IBM和ISO转换为C代码vb.net(可耻的是我自己)7064 MOD 36/37

我有一个问题:我跑了ISO 7064 MOD 36/37代码的C版本,它想出了一个"P",不是"R"是在C代码。我猜这只是一个错字?

checkdigit8.dsp

/ / _tstring数= _T("D98989898909899"); / / C = R
/ / _tstring数= _T("D9898989890989"); / / C = 4

谢谢!

我新的网站,我引用这篇文章,并提交vb.net项目,结合我上面提到的3种方法感兴趣。

约翰
评论会员:杰弗里沃尔顿 时间:2011/12/07
喜约翰​​,

LongRoad写道:"我的应用程序的权利checkdigit的创造者,这是我一直在寻找的最详细的解释
。感谢。我发现很少上Verhoeff在网络上,所以我把他的东西,一个古老的大学教科书。我还发现了很多破碎的实现。因此,我认为一个很好的交代,将有利于所有。

LongRoad写道:我有C代码转换到vb.net(我的耻辱)Verhoeff,IBM和ISO 7064 MOD 36/37
。没有问题。我有点懒自己。也看到大卫干草的评论如下。他有一个C#执行

LongRoad写道:"我跑了C版本的ISO 7064 MOD 36/37代码,它带有一个"P",不是"R"如在C代码中。我猜这只是一个错字?
这可能是一个错字。如果我得到一个机会,我会尽量挖掘一些测试向量和验证。

杰夫
评论会员:丹尼-罗德里格斯 时间:2011/12/07
[留言删除]
评论会员:rfmobile 时间:2011/12/07
见第第二段

好东西顺便说一句!
评论会员:杰弗里沃尔顿 时间:2011/12/07
我胖手指... ...我可能越过电线与伦纳德阿德勒曼(RSA中的"A")。
我的道歉。
评论会员:汉斯迪特里希 时间:2011/12/07
如何下载所有链接?

最美好的祝愿,
汉斯
{A15}
评论会员:canozurdo 时间:2011/12/07
这是一个很好的文章,我没有任何有关这个问题。

细则
评论会员:NinjaCross 时间:2011/12/07
我最好的致意,这个优秀的文章,你已经有了我的五{S12}

-
NinjaCross
{A16}
评论会员:杰弗里沃尔顿 时间:2011/12/07
费德里科。
评论会员:大卫海伊 时间:2011/12/07
优秀文章

如果有人想Verhoeff算​​法在C#中的实现,代码已经在以下位置上的代码项目:

{A17}

干杯
大卫
评论会员:杰弗里沃尔顿 时间:2011/12/07
感谢大卫。

关于作者

杰弗里沃尔顿
中国
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
或代码 网站备案号:粤ICP备15020848号-1