Luhn算法PHP实现

关于Luhn算法

参考:

https://en.wikipedia.org/wiki/Luhn_algorithm

https://baike.baidu.com/item/Luhn算法

PHP代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Luhn
{
/**
* 补填校验位
* @param string $rawNo 原始号码
* @return string 补填校验位后的号码
*/
public static function gen($rawNo)
{
return $rawNo . self::calcCheckNum($rawNo);
}

/**
* 校验给定数据
* @param string $no 需要校验的数据
* @return bool true:通过|false:不通过
*/
public static function verify($no)
{
$rawNo = substr($no, 0, -1);
$checkNo = intval(substr($no, -1));
return $checkNo == self::calcCheckNum($rawNo);
}

/**
* 计算校验值
* @param string $rawStr 原始字符串(不含校验位)
* @return int 校验值
*/
private static function calcCheckNum($rawStr)
{
$strrev = strrev($rawStr);
$sum = 0;
for ($i = 0; $i < strlen($strrev); $i++) {
$val = intval($strrev[$i]);
$sum += ($i % 2 == 0) ? ($val > 4 ? (2 * $val - 9) : (2 * $val)) : $val;
}
$ret = 10 - $sum % 10;
return $ret == 10 ? 0 : $ret;
}
}