喜迎
春节

Luhn算法详解


Luhn算法,也称为模10算法,是一种简单的校验和算法,常用于验证各种身份识别码,比如银行卡号、国际移动设备识别码(IMEI)、美国国家提供商标识号码等。它能快速地检测出输入中的单一数字错误,例如错位、漏掉或多输入一个数字。

Luhn算法的工作原理

  1. 从右向左编号: 给要校验的数字字符串从右向左编号,从1开始。
  2. 隔位求和: 从右向左遍历,偶数位上的数字乘以2。如果乘积大于等于10,则将乘积的各位数字相加。
  3. 所有数字求和: 将所有数字(包括经过处理的偶数位数字)相加,得到一个总和。
  4. 判断校验位: 如果总和能被10整除,则校验通过,否则校验失败。

PHP实现Luhn算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function luhn_check($number) {
$sum = 0;
$numDigits = strlen($number);
for ($i = 0; $i < $numDigits; $i++) { // 从右向左遍历数字字符串的每一位
$digit = ord($number[$numDigits - $i - 1]) - 48; // 获取当前位上的数字
if ($i % 2 == 1) {
$digit *= 2;
if ($digit > 9) {
$digit -= 9;
}
}
$sum += $digit;
}
return $sum % 10 == 0;
}

代码解释

  • 从右向左遍历: 循环遍历数字字符串,从右向左处理每一位数字。
  • 获取当前位上的数字: 数字字符的ASCII码比数字本身大48;这里不能改为$digit = (int)$number[$numDigits - $i - 1];因为如果字符串中包含非数字字符,强制类型转换的结果可能会是0。而 ord() 函数则会更可靠地将字符转换为数字。
  • 偶数位处理: 对于偶数位的数字,乘以2,如果结果大于9,则减去9。
  • 求和: 将所有处理后的数字相加,得到总和。
  • 校验: 判断总和是否能被10整除,如果能整除,则校验通过。

使用示例

1
2
3
4
5
6
$cardNumber = '1234567890123456';
if (luhn_check($cardNumber)) {
echo "卡号校验通过";
} else {
echo "卡号校验失败";
}

Luhn算法的优点

  • 简单高效: 算法简单易懂,计算量小,适合快速验证。
  • 检测错误能力强: 能检测出大部分的单一数字错误。

Luhn算法的局限性

  • 不能检测所有错误: 对于某些特定的错误组合,Luhn算法可能无法检测出来。
  • 不是绝对安全: Luhn算法只能作为一种简单的校验手段,不能完全保证数据的正确性。

总结

Luhn算法是一种常用的校验算法,特别适合用于验证身份识别码的正确性。虽然它不能检测所有的错误,但仍然是一种简单有效的校验方法。在实际应用中,可以将Luhn算法与其他校验方式结合起来,提高数据的可靠性。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
Boyer-Moore算法
Boyer-Moore算法
Boyer-Moore算法简介Boyer-Moore算法是一种高效的字符串搜索算法,它通过跳过文本中明显不匹配的部分,显著提高了搜索效率。相较于传统的暴力匹配算法,Boyer-Moore算法在大多数情况下性能更佳,尤其是在搜索较长的模式串时
2024-11-21
下一篇 
如何评判一段程序的好坏:复杂度分析
如何评判一段程序的好坏:复杂度分析
评判一段程序的好坏,除了功能的正确性之外,算法的效率也是一个非常重要的指标。而复杂度分析就是用来衡量算法效率的一种方法。 复杂度分析是什么?复杂度分析是对算法在运行过程中所需时间资源和空间资源的数量的估算。 时间复杂度: 表示算法执行时间
2024-11-21

Luhn算法,也称为模10算法,是一种简单的校验和算法,常用于验证各种身份识别码,比如银行卡号、国际移动设备识别码(IMEI)、美国国家提供商标识号码等。它能快速地检测出输入中的单一数字错误,例如错位、漏掉或多输入一个数字。

Luhn算法的工作原理

  1. 从右向左编号: 给要校验的数字字符串从右向左编号,从1开始。
  2. 隔位求和: 从右向左遍历,偶数位上的数字乘以2。如果乘积大于等于10,则将乘积的各位数字相加。
  3. 所有数字求和: 将所有数字(包括经过处理的偶数位数字)相加,得到一个总和。
  4. 判断校验位: 如果总和能被10整除,则校验通过,否则校验失败。

PHP实现Luhn算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function luhn_check($number) {
$sum = 0;
$numDigits = strlen($number);
for ($i = 0; $i < $numDigits; $i++) { // 从右向左遍历数字字符串的每一位
$digit = ord($number[$numDigits - $i - 1]) - 48; // 获取当前位上的数字
if ($i % 2 == 1) {
$digit *= 2;
if ($digit > 9) {
$digit -= 9;
}
}
$sum += $digit;
}
return $sum % 10 == 0;
}

代码解释

  • 从右向左遍历: 循环遍历数字字符串,从右向左处理每一位数字。
  • 获取当前位上的数字: 数字字符的ASCII码比数字本身大48;这里不能改为$digit = (int)$number[$numDigits - $i - 1];因为如果字符串中包含非数字字符,强制类型转换的结果可能会是0。而 ord() 函数则会更可靠地将字符转换为数字。
  • 偶数位处理: 对于偶数位的数字,乘以2,如果结果大于9,则减去9。
  • 求和: 将所有处理后的数字相加,得到总和。
  • 校验: 判断总和是否能被10整除,如果能整除,则校验通过。

使用示例

1
2
3
4
5
6
$cardNumber = '1234567890123456';
if (luhn_check($cardNumber)) {
echo "卡号校验通过";
} else {
echo "卡号校验失败";
}

Luhn算法的优点

  • 简单高效: 算法简单易懂,计算量小,适合快速验证。
  • 检测错误能力强: 能检测出大部分的单一数字错误。

Luhn算法的局限性

  • 不能检测所有错误: 对于某些特定的错误组合,Luhn算法可能无法检测出来。
  • 不是绝对安全: Luhn算法只能作为一种简单的校验手段,不能完全保证数据的正确性。

总结

Luhn算法是一种常用的校验算法,特别适合用于验证身份识别码的正确性。虽然它不能检测所有的错误,但仍然是一种简单有效的校验方法。在实际应用中,可以将Luhn算法与其他校验方式结合起来,提高数据的可靠性。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
Boyer-Moore算法
Boyer-Moore算法
Boyer-Moore算法简介Boyer-Moore算法是一种高效的字符串搜索算法,它通过跳过文本中明显不匹配的部分,显著提高了搜索效率。相较于传统的暴力匹配算法,Boyer-Moore算法在大多数情况下性能更佳,尤其是在搜索较长的模式串时
2024-11-21
下一篇 
如何评判一段程序的好坏:复杂度分析
如何评判一段程序的好坏:复杂度分析
评判一段程序的好坏,除了功能的正确性之外,算法的效率也是一个非常重要的指标。而复杂度分析就是用来衡量算法效率的一种方法。 复杂度分析是什么?复杂度分析是对算法在运行过程中所需时间资源和空间资源的数量的估算。 时间复杂度: 表示算法执行时间
2024-11-21
  目录
  目录
hexo