首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP實現Luhn算法驗證信用卡號:兩種高效代碼版本

     編輯:PHP 相關知識

Luhn 算法(Mod 10)原理與 PHP 實戰

Luhn 算法是國際標準 ISO/IEC 7812-1 規定的校驗碼算法,廣泛用於信用卡、IMEI、身份證號等號碼驗證。核心步驟:

  1. 從右向左(不含校驗位),奇數位保持,偶數位乘 2(若 ≥10 則減 9)。
  2. 所有數字求和,總和對 10 取模為 0 則合法。

版本一:經典位運算實現(高效、易懂)

<?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 風格)

<?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

工程落地建議

  • 前端輸入時即時格式化(每 4 位加空格)並調用 Luhn 預檢,減少無效提交。
  • 後端務必再次驗證,防繞過前端檢查。
  • 結合 BIN 表(前 6-8 位)識別發卡行、卡類型(Visa/Master/Amex 等),進一步校驗長度與前綴。
  • 生產環境嚴禁存儲完整卡號,僅保留掩碼(如 **** **** **** 1234)與 Token。

Luhn 算法輕量、無依賴,是支付系統、表單驗證中不可或缺的第一道防線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved