EAN-13 校验位的工作原理
每个 EAN-13 条形码的第 13 位数字都不是随意选定的——它是计算得出的。下面介绍公式、一个完整的示例,以及它为何重要。
EAN-13 条形码编码了十三位数字。前十二位标识产品(GS1 前缀、公司前缀和商品编号);第十三位是校验位——由其余十二位计算得出的单个数字。它唯一的作用就是发现错误:如果其中一位被输错或误读,校验位就不再匹配,这次扫描就会被拒绝。
用通俗的话讲这个公式
从左到右读取这十二位数据位:
- 将奇数位(第 1、3、5……位)上的数字乘以 1。
- 将偶数位(第 2、4、6……位)上的数字乘以 3。
- 把所有结果相加得到一个总和。
- 校验位就是你必须加到这个总和上以达到下一个十的倍数的数字。用公式表示:校验位 = (10 − (总和 mod 10)) mod 10。
末尾的这个 “mod 10” 对一种边界情况很重要:如果总和本身已经是十的倍数,则校验位是 0,而不是 10。
一个完整的示例
取这十二位数据位 400638133393。将它们与各自的权重排列出来:
| 数字 | 4 | 0 | 0 | 6 | 3 | 8 | 1 | 3 | 3 | 3 | 9 | 3 |
| 权重 | 1 | 3 | 1 | 3 | 1 | 3 | 1 | 3 | 1 | 3 | 1 | 3 |
| 乘积 | 4 | 0 | 0 | 18 | 3 | 24 | 1 | 9 | 3 | 9 | 9 | 9 |
这些乘积相加得到 4 + 0 + 0 + 18 + 3 + 24 + 1 + 9 + 3 + 9 + 9 + 9 = 89。89 以上下一个十的倍数是 90,而 90 − 89 = 1。所以校验位是 1,完整的 EAN-13 就是 4006381333931。
扫描器为何依赖它
当扫描器读取一个 EAN-13 时,它会对前十二位数字重复完全相同的计算,并将结果与第十三位比较。如果二者不一致,这次读取就会被丢弃。这一个额外的数字能捕捉到绝大多数单个数字的输入错误和许多换位错误——为避免在收银台扫描到错误的产品提供了廉价的保障。
同样的算法支撑着 UPC、EAN-8 和 GTIN-14
EAN-13 的方法其实就是 GS1 模 10 算法,并在整个家族中通用:UPC-A(11 位数据位)、EAN-8(7 位数据位)和 GTIN-14 / ITF-14(13 位数据位)都从右侧起使用相同的交替权重 3 和 1。只是长度不同;逻辑完全一样。