Luhn 算法是國際標準 ISO/IEC 7812-1 規定的校驗碼算法,廣泛用於信用卡、IMEI、身份證號等號碼驗證。核心步驟:
<?php
function luhnTest(string $num): bool {
$len = strlen($num);
$sum = 0;
for ($i = $len - 1; $i >= 0; $i--) {
$digit = (int)$num[$i];
// 從右數起,偶數位(索引奇偶性與長度相關)
if (($len - 1 - $i) % 2 === 1) {
$digit *= 2;
if ($digit > 9) $digit -= 9;
}
$sum += $digit;
}
return $sum % 10 === 0;
}
// 測試
$tests = ['49927398716', '49927398717', '1234567812345678', '1234567812345670'];
foreach ($tests as $n) {
echo "$n => " . (luhnTest($n) ? 'valid' : 'invalid') . PHP_EOL;
}
/* 輸出
49927398716 => valid
49927398717 => invalid
1234567812345678 => invalid
1234567812345670 => valid
*/
<?php
function luhnTestV2(string $num): bool {
return array_sum(
array_map(
fn($d) => $d > 9 ? $d - 9 : $d,
array_map(
fn($c, $i) => ($i % 2 === 1 ? (int)$c * 2 : (int)$c),
array_reverse(str_split($num)),
array_keys(array_reverse(str_split($num)))
)
)
) % 10 === 0;
}
<?php
function generateValidCard(string $prefix, int $totalLen = 16): string {
$body = $prefix . str_pad('', $totalLen - strlen($prefix) - 1, '0', STR_PAD_RIGHT);
// 隨機填充中間位
$body = substr($body, 0, -1) . random_int(0, 9);
// 計算校驗位
$sum = 0;
for ($i = strlen($body) - 1; $i >= 0; $i--) {
$d = (int)$body[$i];
if ((strlen($body) - 1 - $i) % 2 === 0) {
$d *= 2;
if ($d > 9) $d -= 9;
}
$sum += $d;
}
$check = (10 - $sum % 10) % 10;
return $body . $check;
}
echo generateValidCard('4539', 16); // 如 4539000000000007
**** **** **** 1234)與 Token。Luhn 算法輕量、無依賴,是支付系統、表單驗證中不可或缺的第一道防線。