1. 程式人生 > >java實現銀行卡卡號 Luhm 校驗演算法

java實現銀行卡卡號 Luhm 校驗演算法

效驗是否為銀行卡,用於驗證 
現行 16 位銀聯卡現行卡號開頭 6 位是 622126~622925 之間的,7 到 15 位是銀行自定義的,
可能是髮卡分行,髮卡網點,髮卡序號,第 16 位是校驗碼。

16 位卡號校驗位採用 Luhm 校驗方法計算:

1,將未帶校驗位的 15 位卡號從右依次編號 1 到 15,位於奇數位號上的數字乘以 2
2,將奇位乘積的個十位全部相加,再加上所有偶數位上的數字
3,將加法和加上校驗位能被 10 整除。
------------------------------------------ 

6 2 2 5 8 8 1 4 1 4 2 0 7 4 3 * 2 2 2 2 2 2 2 2 -------------------------------------------------- 12 2 4 5 16 8 2 4 2 4 4 14 4 6 將上面的數字加和:1+2+2+4+5+1+6+8+2+4+2+4+4+1+4+4+6 = 60 由於 60 加上 0 才能被 10 整除,所以校驗位為 0 因此該卡號為 6225 8814 1420 7430 ---------------------------------------------

如果其中一位數字換掉的話,直接導致最後校驗位錯誤。

public class Test {
 
    public static void main(String[] args) {
        String card = "6227007200120897790";
        System.out.println("      card: " + card);
        System.out.println("check code: " + getBankCardCheckCode(card));
        System.out.println("是否為銀行卡:"+checkBankCard(card));
    }
    
    /**
     * 校驗銀行卡卡號
     * @param cardId
     * @return
     */
    public static boolean checkBankCard(String cardId) {
             char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1));
             if(bit == 'N'){
                 return false;
             }
             return cardId.charAt(cardId.length() - 1) == bit;
    }
    
    /**
     * 從不含校驗位的銀行卡卡號採用 Luhm 校驗演算法獲得校驗位
     * @param nonCheckCodeCardId
     * @return
     */
    public static char getBankCardCheckCode(String nonCheckCodeCardId){
        if(nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0
                || !nonCheckCodeCardId.matches("\\d+")) {
            //如果傳的不是資料返回N
            return 'N';
        }
        char[] chs = nonCheckCodeCardId.trim().toCharArray();
        int luhmSum = 0;
        for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if(j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;           
        }
        return (luhmSum % 10 == 0) ? '0' : (char)((10 - luhmSum % 10) + '0');
    }
}


相關推薦

java實現銀行卡 Luhm 演算法

效驗是否為銀行卡,用於驗證 現行 16 位銀聯卡現行卡號開頭 6 位是 622126~622925 之間的,7 到 15 位是銀行自定義的,可能是髮卡分行,髮卡網點,髮卡序號,第 16 位是校驗碼。16 位卡號校驗位採用 Luhm 校驗方法計算:1,將未帶校驗位的 1

銀行卡LuhmJava實現程式碼

public class CheckBankNumber {// Description: 銀行卡號Luhm校驗// Luhm校驗規則:16位銀行卡號(19位通用):// 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位於奇數位號上的數字乘以 2。// 2.將奇位乘積的個十位全

銀行卡驗證js(銀行卡Luhm)

//銀行卡號校驗 //Description: 銀行卡號Luhm校驗 //Luhm校驗規則:16位銀行卡號(19位通用): // 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位於奇數位號上的數字乘以 2。 // 2.將奇位乘積的個十位全部相加,再加上所有偶數位上的數字。 //

微信企業回調模式配置解說 Java Servlet+Struts2版本 echostr失敗解決

del com crypt atp org use ase http err 微信企業號回調模式配置解說 Java Servlet+Struts2版本號

銀行卡Luhm演算法

if (val.length >= 16) { var pattern = RegExp(/^[0-9]{16}$/); if (val.length == 19) { pattern = RegExp(/^[0-9]{19}$/);

銀行卡LUHM演算法(C++)

演算法比較簡單。 1、除去校驗位後,從右至左,將卡號按位編碼,從0開始。 2、將偶數位×2,得到的結果按位相加,比如偶數為6,×2=12,則將1和2相加=3;奇數位則直接參與相加; 3、重複步驟2得到總和,該總和加上校驗位應能被10整除,否則校驗位不正確。 圖解: 設卡號

Java使用luhn演算法實現銀行卡合法性&&獲取銀行卡所屬銀行

Luhn校驗演算法或是Luhn 公式,也被稱作“模10演算法”。它是一種簡單的校驗公式,一般會被用於身份證號碼,IMEI號碼,美國供應商識別號碼, 或是加拿大的社會保險號碼的驗證。該演算法是由IBM的科學家Hans Peter Luhn所創造,於1954年1月6日提出該

Java之——基於Luhn演算法銀行卡的格式

一、檢驗規則 Luhn演算法被用於最後一位為校驗碼的一串數字的校驗,通過如下規則計算校驗碼的正確性:     按照從右往左的順序,從這串數字的右邊開始,包含校驗碼,將偶數位數字乘以2,如果每次乘二操作的結果大於9(如 8 × 2 = 16),然後計算個位和十位數字的和(如

前端JS銀行卡和身份證號碼(附ES6版方法)

var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加權因子 var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]; // 身份證驗證位值.10代表X funct

Js實現16/19位銀行卡前端

//luhn校驗規則:16位銀行卡號(19位通用): // 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位於奇數位號上的數字乘以 2。 // 2.將奇位乘積的個十位全部相加,再加上所有偶數位上的數字。

java實現CRC16 MODBUS演算法

最近做通訊開發,遇到了校驗碼的問題 我在這個網站上試了試 裡面有各種crc16的校驗碼 廢話不多說,直接上程式碼 /** * 計算CRC16校驗碼 * * @param bytes * @return

銀行卡

銀行卡號的校驗 ,js 函式,針對普通的16位和19位銀行卡校驗有效,使用 Luhm 校驗方法。 function luhmCheck(cardNum){ cardNum = (cardNum+'').replace(/\s+/g,''); if(!(/^\d{16,19

Java實現身份證演算法

public class ValidateNumberId { private static String[] validtable = {"1","0","X","9","8","7",

CRC查表法——表的由來及Java實現CRC8演算法

你也可以檢視我的其他同類文章,也會讓你有一定的收貨! 大概思路 我先說一下查表法,表的計算方法,以CRC4為例: 生成多項式:B = 10011B 測試資料:A = 0011 1110B 1、查表法實際上是利用XOR的交換律和結合律:(A X

銀行卡識別:C#版本和iOS版本

及其 emgucv ria topic ext 網址 整體 link 比較 (一)圖像采集 首先我們要取得待識別的圖像。這項工作可以通過數碼相機、DV機、工業攝像機、電腦數字攝像頭、手機攝像頭等設備采集,並從中取得我們要分析的圖像信息。 (二)版面分析

微信公眾 Token失敗 基於spring-boot

最開始是這麼寫: @GetMapping(produces = "text/plain;charset=utf-8") public String authGet( @RequestParam(name = "signature", required = false)

實現一次性驗證碼的

建立一個servlet隨機生成認證碼圖片 //輸出隨機認證碼圖片 public class VerifyServlet extends HttpServlet { //圖片的寬度 public static final Integer WIDTH = 130;

[無心插柳]簡單實現常用的表單函式

有意取而不得,失落而歸。無意間有所獲,未有喜悅,但珍惜依舊 1.前言 表單校驗,相信絕大部分的開發者會遇到過,網上也有很多外掛可使用。但當時想著就是簡單的校驗,沒必要引外掛,就自己寫一個簡單的函式。隨著校驗的需求多樣化,函式越來越大。有點輪子的雛形,算是無心插柳吧。現在也該分享出來了,和大家交流

模擬RSA雙向驗證,並且實現DES加密以及MD5過程(python程式碼實現

要求如下:            (1)A,B兩端各生成公鑰金鑰對(PA,SA), 金鑰對(PB,SB)。            (2)A端生成隨機數N1,用B的公鑰PB加

利用Vue計算資料屬性實現簡單的表單

        計算資料屬性(官網稱呼),又叫動態資料繫結(相對於靜態資料繫結而言).可以在dom渲染之前修改資料.按照官網的解釋,計算資料屬性是為了簡化模板的運算邏輯.從而利於維護.把複雜的邏輯繫結在computed裡.當然,利用它也可以做很多事情.比如單選,全選的實現.今