( ! ) Notice: Undefined index: mobile in /var/www/html/head.php on line 16
Call Stack
#TimeMemoryFunctionLocation
10.0001230208{main}( ).../view.php:0
20.0001230952include( '/var/www/html/head.php' ).../view.php:2
30.0009250312isMobile( ).../head.php:30
数学思维训练网 - 小学计算思维课程(12)-哈希校验

小学计算思维课程(12)-哈希校验

小学计算思维课程(12)-哈希校验

本书共26课,如果您有好的建议,请联系作者:浙江省新昌县城西小学 唐明 147885198@qq.com


第十二课:哈希校验

每一本公开发行的书封底上都有一个10位或13位的编号,称为“国际标准书号”(ISBN)。

ISBN的最后一位数字称为计算机校验码。这样一来,如果你用ISBN订购一本书,书店就可以用其中的计算机校验码来检查你是否订错。

2007年1月开始,图书统一开始使用13位的ISBN,而之前ISBN通常只有10位,下面我们来看看如何算出10位ISBN的校验码。

将第一位数字乘10,第二位乘9,第三位乘8,依此类推,一直到第9位乘2。将它们相加的总和除以11,记下余数,再用11减去这个余数就得到了检验码。有时校验码是10,这时我们用X代替(X在罗马数字中代表10),让我们看一个例子:

ISBN 0-13-911991-4

(0×10)+(1×9)+(3×8)+(9×7)+……+(1×2)=172

172÷11=15……7

11 - 7=4

问题:

1.自己试着计算一次,看看校验码是不是4。

2.如果将上面ISBN码中的3换成5,最后计算得到的校验码是多少?

3.如果两个数字颠倒变成了0-13-191991-4,校验码又是多少?

4.你能找出只改变上面ISBN码中的一个数字,并保证最后的校验码不变的方法吗?想一想是为什么?

5.ISBN 1-00-235045-X的校验码正确吗?



当使用13位ISBN后,生成校验码的方法简单多了,只需要将第一位乘1,第二位乘3,第三位乘1,第四位乘1,依此类推,直到第十二位乘3,然后将结果相加后除以10得到余数,用10减这个余数就得到校验码。下面看一个例子:

ISBN 978-89728357-4

(9×1)+(7×3)+(8×1)+(8×3)+(9×1)+……+(7×3)=146

146÷10=14……6

10-6=4

问题:

1.如果交换这个ISBN其中的两位数字,校验码可以发现这个错误吗?

2.如果修改其中的一个数字,校验码可以发现这个错误吗?

3.如果颠倒其中的连续三个数字变成879-89728357-4,能发现错误吗?

4.找到修改最少数据而让校验码不变的方法。

这样的校验码还被用于超市的条形码扫描中,商品通过结账处的扫描枪时,扫描枪将条形码数据读入并计算校验码是否正确,如果不正确,扫描枪将鸣声报错,收银员就知道他们需要再扫一次条形码。

条形码或是ISBN中的校验位又被称为哈希总和(Hash total),即一个基于全部数据之和,却和具体各位上的数字没有明显关系的数值

另外有趣的是,一般商品条形码的前几位表示的是产品原产地,如原产中国的产品以690开头,然而不论哪个国家的书刊均以978或979开头,如果你查询一下这个号码对应的国家,你将会发现它代表“书国”,一个人们想象中的国度!