我决定使用 Luhn 算法来验证一些瑞典的社会安全号码。通过自己编写函数,我得到了按计划工作,尽管存在一些问题。使用我的代码和我尝试过的其他代码,我发现它仍然可以验证简单的组合,例如 2222222222 和 4444444444 是有效的。
这两个例子很容易避免,但它让我想知道其余的组合是假的,但仍然通过使用算法验证为真。
是我,以及我看过的那些例子,是代码出了问题,还是算法的已知错误?如果是这样,我该如何解决,或者是否有其他更合适的方法?
Luhn 算法并不意味着验证 SSN 号码是否有效。只是它的格式有效。它有助于捕获错误输入的数字,并使黑客/垃圾邮件发送者试图破坏您的系统变得更加困难。这并不意味着阻止输入错误的数字。
该算法也用于美国的信用卡号码。但是像 4111111111111111 这样的测试卡号就可以通过了。在您尝试付款之前捕获错误数字非常有帮助,即使您每次付款都会产生费用,即使它不成功。但要最终知道信用卡号是否合适,您需要实际收取费用。
从理论上讲,这些都是有效数字——Luhn 算法是对输入错误数字的人的校验和,而不是用于判断他们是否编造了这些数字。
例如,支付网关(英国)中使用的标准测试信用卡之一是 4444333322221111,它恰好是有效的 Visa 卡号。由于该卡未分配给任何人,因此尝试实际使用它付款会失败,但这与校验位无关,而与数字背后的含义有关。