在 Global Verification Authority,你刚被委以一项至关重要的任务。整座城市里,从在线购物到安全登录,无数业务都依赖数字标识符的准确性,比如信用卡号、银行账号、交易代码和追踪编号。Luhn 算法是一种简单的校验和公式,用来帮助找出输错的数字。
一批标识符刚刚送到你的桌上。它们全都要通过 Luhn 检验,才能确认是合法的。只要有通不过的,就会被标记为无效,从而避免交易出错或账户验证失败这类失误。
你能确保这件事万无一失吗?许多服务的正常运转都取决于你。
根据 Luhn 公式,判断一个数字是否有效。
这个数字会以字符串的形式提供。
长度不超过 1 的字符串无效。输入中允许有空格,但在检查前应当先把空格去掉。所有其他非数字字符都不允许出现。
要检查的数字是 4539 3195 0343 6467。
Luhn 算法的第一步是从数字末尾开始,从右数第二位起向左,把每隔一位的数字翻倍。
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
如果某个数字翻倍后的结果大于 9,就从该结果中减去 9。得到的结果是:
8569 6195 0383 3437
最后,把所有数字相加。如果和能被 10 整除,原来的数字就有效。
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
80 能被 10 整除,所以数字 4539 3195 0343 6467 是有效的!
要检查的数字是 066 123 468。
我们从数字末尾开始,从右数第二位起向左,把每隔一位的数字翻倍。
066 123 478
↑ ↑ ↑ ↑ (double these)
如果某个数字翻倍后的结果大于 9,就从该结果中减去 9。得到的结果是:
036 226 458
把各位数字相加:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36 不能被 10 整除,所以数字 066 123 478 无效!
我们会探索 8 个不同版本的 Luhn,从一个非常简洁的 Ruby 实现开始,看看一些命令式和函数式的写法,最后是一个让 Erik 和 Jeremy 花了不少功夫才破译的 SQLite 版本!