导航:首页 > 源码编译 > luhm算法

luhm算法

发布时间:2022-07-31 16:52:31

1. 兴业银行卡号的具体编码规则

根据ISO标准,银行卡长度一般在13-19位,国际上也有12位的。银联标准卡卡长度一般是在16-19位,双组织卡也有13-19位的。

兴业银行借记卡号由以下三部分构成。

前6位数字:为发行者识别号码(Issuer Identification Number,缩写为IIN),也称为发卡行识别码(Bank Identification Number,简称BIN),由中国银联代国内各发卡机构统一向ISO申请,兴业银行一般都是622909开头。

中间的位数(7-18位):为个人账户号码(从卡号第七位开始),最大12位,最后一位位数是校验位。

将卡号前面的数字采用Luhn算法计算出信用卡或者借记卡的最后一位数字。

使用Luhn算法校验的步骤:

  1. 从右边第1个数字(校验数字)开始偶数位乘以2;
  2. 把步骤1种获得的乘积的各位数字与原号码中未乘2的各位数字相加;
  3. 如果步骤2得到的总和模10为0,则校验通过。

2. 什么是“2121”校验方法

2121校验应该就是利用Luhn算法

Luhn 算法或是Luhn
公式,也被称作“模10算法”。它是一种简单的校验公式,一般会被用于身份证号码,IMEI号码,美国供应商识别号码,或是加拿大的社会保险号码的验证。该算法是由IBM的科学家Hans
Peter Luhn所创造,于1954年1月6日提出该专利的申请,并于1960年8月23日被授予,在美国的专利号为2950048。

该算法一直都被大家所公用,并且时至今日应用也很广泛。它被指定在ISO/IEC7812-1。它的目的不是成为一种加密安全的哈希函数;它的目的是防止意外出现的错误,而不是恶意攻击。很多信用卡和众多的政府身份识别号码都使用该算法从一系列的随机数字中提取有效的数字。

优点和缺点

Luhn
算法会检测到任何单码的错误以及几乎所有的相邻数字换位的错误。但是它不会检测两个数字序列09转90的错误(反之亦然)。它会检测到十分之七的相同双位数错误(不会检测到22和55的互换,33和66的互换,44和77的互换)。其他更复杂的检查数字算法,如费尔赫夫算法,可以检测出更多的转录错误。模N的Luhn算法是Luhn算法的一个扩展,支持非数字字符串。因为该算法采取了从右向左的方式,而且零位会影响计算的结果。只有当零位造成了数位的移动或是用零来填充一串数字的开头时才不会影响计算结果的生成。因此不论在将1234用零填充为0001234之前或是之后,使用Luhn算法得到的结果都是一样的。

该算法在美国专利上是为了给手持或是机械设备计算校验码。所以它必须尽可能的简单。

非正式的解释

该公式会通过校验码对一串数字进行验证。校验码通常会被加到账户号码中,从而拼合成一个完整的账户号码。拼合后的账户号码要通过以下的测试:

1.从校验位开始计数(校验位一般添加在账户的最后面),按从右向左的顺序,将偶数都乘以2.

2.将得到的结果相加起来(例如:10=1+0=1,14=1+4=5,也有的说法是若是乘2的结果是两位数的话,那么就直接减去9,和之前位数拆开相加的结果是一样的),然后再与原数字串的奇数位相加。

3.如果加起来的和模10后为0(也就是相加的结果是以0结尾的,10的倍数),那么这个数字串根据Luhn算法来说就是有效的,反之就是无效的。

假设一个字符串为“7992739871”,我们为其加上一个校验位,最后组成的数字为7992739871x:

账户号码: 7 9 9
2 7 3
9 8 7 1 x

将偶数位乘以2:7 18 9 4 7 6 9
16 7 2
x

相加后的数字: 7 9 9 4 7 6 9 7 7
2 =67

校验码x是通过将相加后的数字乘以9后,在进行模10计算(那么就是:(67*9)mod10,也有的说法是取比相加的和最小的10的整数倍数字,其实结果都是一样的)。通俗地说:

1.计算所有位数的和(67)。

2.将其乘以9(603)。

3.取最后一位数字(3)。

4.得到的结果就是校验位。

另外一种得到校验位的方法:先计算所有位数的和,用10减去所有位数和模10的结果。(67的个位是7;10-7=3即为校验位)。通俗地说:

1.计算所有位数的和(67)。

2.取个位数(7)。

3.用10减去个位数(3)。

4.得到的结果就是校验位。

这样,我们得到的完整的账户号码是:7992739871x。

下面的每一个数字 79927398710, 79927398711, 79927398712, 79927398713, 79927398714,
79927398715, 79927398716, 79927398717, 79927398718,
79927398719都给以用如下的方法进行验证。

1.从最右边开始计算,将偶数位都乘以2:(1*2)=2,(8*2)=16,(3*2)=6,(2*2)=4,(9*2)=18

2.将每一位数字加起来:x(校验位)+(2)+7+(1+6)+9+(6)+7+(4)+9+(1+8)+7=X+67.

3.如果得到的结果是10的倍数,那么这个账户号码就可能是有效的。需要注意的是3就是唯一的可以使得和(67+x)是10的整数倍的个位数。

4.因此,以上的所有账户除了79927398713 是有效的以外,其他均为无效的账户。

校验位的验证的代码实现

以下通过Python来实现的:

def luhn_checksum(card_number):

def digits_of(n):

return [int(d) for d in str(n)]

digits = digits_of(card_number)

odd_digits = digits[-1::-2]

even_digits = digits[-2::-2]

checksum = 0

checksum += sum(odd_digits)

for d in even_digits:

checksum += sum(digits_of(d*2))

return checksum % 10

def is_luhn_valid(card_number):

return luhn_checksum(card_number) == 0

校验位的计算

上面的算法检查输入校验位的有效性。计算校验位需要一个小的适应算法,即:

1.切换奇/偶乘法。

2.如果得到的和(sum)模10等于0的话,那么校验码就是0。

3.否则,校验码就等于10减去得到的和模10(10 - (sum mod 10))

def calculate_luhn(partial_card_number):

return 10 - luhn_checksum(int(partial_card_number) * 10)

3. 一个银行卡号是19位,前面18位是有简单规律的,最后一位是校验位,通过luhn算法得到。规则为:

= A1&10-MOD(SUM(2 * MID(A1,ROW($ 1:$ 10)* 2-1,1)-9 *(MID(A1,ROW($ 1:$ 10)* 2-1 ,1)-4> 0))+ SUM( - MID(A1,ROW($ 1:$ 9)* 2,1)),10)公式用CTRL + SHIFT + ENTER三到结束。

4. 富滇银行借记卡不支持BIn是什么意思

银行卡有唯一的卡bin 供银行和银行卡产品之类区分, 这个提示就是你这个银行卡不支持。
实名认证有两种方式,一种是快捷认证,一种是普通认证。
1.快捷认证就是要用银行卡的,这个银行卡就是以后可以和支付宝绑定进行充值和提现的银行卡。这个银行卡不想用了,是可以取消和更换银行卡的。
2. 第二种认证就是普通认证,这种认证不需要银行卡,但是需要用到身份证信息。 有不知道的请继续追问。
第一步:登录,点击“个人网银登录”输入用户名、密码、验证码;
第二步:选择下载“根证书链安装”或者“安全控件下载”完成后运行安全控件“kpsignX1.7.0.2.exe”;
第三步:“USB-Key管理工具下载”;
第四步:成功安装、下载安全控件和“USB-Key管理工具”。
操作环境:win10,搜狗浏览器V15.62.6
富滇卡是富滇银行向社会大众发行的,以客户真实信息开立,具有存取现金、消费支付、转账结算、代理缴费等多种功能的银联标准借记卡产品。
目前,拥有一卡通、储蓄卡和个人结算账户卡等三大类卡种系列。
现针对富滇银行社保卡持有人群相对较多,使用率低这一现状,我司提出改进意见,希望协
助富滇银行打造统一、鲜明、有高度认知的社保卡产品品牌形象,节省资源获取更大的成功。此方案,以品牌的经营为导向,以产品的实际利益为诱饵,打动客户,以实际姿态呼应品牌形象。故提出以下“三步”策略,加大储蓄、拉动存款、扩大富滇银行多项金融产品联动经营。
富滇卡根据“富滇银行”英文名称“FUDIAN BANK”首字母“F”进行抽象设计,并从中射出多道光束,寓意新成立的富滇银行大放异彩。另外,深红色基调设计效果,既体现富滇银行悠久而厚重的历史底蕴,同时也表现了新时代背景下的朝气蓬勃、突飞猛进和繁荣昌盛!

5. PHP实现通过Luhn算法校验信用卡卡号是否有效

本文实例讲述了PHP实现通过Luhn算法校验信用卡卡号是否有效的方法。分享给大家供大家参考。具体实现方法如下:
$numbers = "49927398716 49927398717 1234567812345678 1234567812345670";
foreach (split(' ', $numbers) as $n)
echo "$n is ", luhnTest($n) ? 'valid' : 'not valid', '</br>';
function luhnTest($num) {
$len = strlen($num);
for ($i = $len-1; $i >= 0; $i--) {
$ord = ord($num[$i]);
if (($len - 1) & $i) {
$sum += $ord;
} else {
$sum += $ord / 5 + (2 * $ord) % 10;
}
}
return $sum % 10 == 0;
}
运行结果
49927398716 is valid
49927398717 is not valid
1234567812345678 is not valid
1234567812345670 is valid
下面是一个更为简洁的代码:
复制代码 代码如下:
function luhn_test($num) {
$str = '';
foreach( array_reverse( str_split( $num ) ) as $i => $c ) $str .= ($i % 2 ? $c * 2 : $c );
return array_sum( str_split($str) ) % 10 == 0;
}
foreach (array('49927398716','49927398717','1234567812345678','1234567812345670') as $n)
echo "$n is ", luhn_test($n) ? 'valid' : 'not valid', "</br>\n";
输出结果如下
49927398716 is valid
49927398717 is not valid
1234567812345678 is not valid
1234567812345670 is valid

6. 工行卡开头这是b还是6

工行储蓄卡或信用卡卡号均为数字排列,您所描述的工行卡片情况是以数字6开头。

(作答时间:2019年5月29日,如遇业务变化请以实际为准。)

7. 银行卡号的组成

你好朋友
绑卡时输入银行卡号后识别出银行和卡种是如何做到的?为什么能够在卡号输入有误时进行友好提示?本篇文章将为大家揭晓。

一、银行卡结构

XXXXXX XXXXXXXXXXXX X

发卡行标识代码 自定义位 校验码

根据ISO标准,银行卡长度一般在13-19位,国际上也有12位的。银联标准卡卡长度一般是在16-19位,双组织卡也有13-19位的。

二、发卡行标识代码

发卡行标识代码Bank Identification Number(BIN),又叫发卡机构标识代码Issuer Identification Numbers(IIN)。一般由6位数字组成,2014年底,国际标准组织(ISO)已经将BIN由6位数字调整到8位数字。目前国内银联卡,因银行众多,特别是村镇银行的存在,BIN长度以6位占绝大部分,另外还存在7、8、9、10等位数卡BIN。

发卡行标识代码第一位,为发卡行业标识号Major Instry Identifier(MII),代表的是发卡机构所处行业。具体分配规则如下:

目前银联标准卡以62开头,各银行再向银联进行卡BIN申请,如622848开头的卡为农行借记卡。我们发现,银联卡不都是以62开头,主要有2种情况。第一种是双组织卡,如银联、运通双组织卡,一般以信用卡居多,如招行与运通合作的运通卡。另外一种即早期以9开头的银行卡,这些卡都是国内自行分配的,仅限国内使用,无法与国际进行接轨。以下为部分常见卡组织发行的银行卡起始数字:

银联卡,通过卡BIN能获取到的信息不仅仅是发卡行,还能确定该卡卡种、卡名称、卡号长度等信息。以下为部分卡BIN信息列举:

因此,只要能获取到比较全面的卡BIN数据,就能判断出银行卡发卡行及卡种。目前支付宝、微信等大部分主流需要绑卡的应用都是如此实现。
二、自定义位

发卡行自定义位,一般在6-12位。

三、校验码算法

校验码为银行卡号最后一位,采用LUHN算法,亦称模10算法。计算方法如下:

第一步:从右边第1个数字开始每隔一位乘以2;

第二步: 把在第一步中获得的乘积的各位数字相加,然后再与原号码中未乘2的各位数字相加;

第三步:对于第二步求和值中个位数求10的补数,如果个位数为0则该校验码为0。

举例:6259 6508 7177 209(不含校验码的银行卡号)

第一步:6*2=12,5*2=10,6*2=12,0*2=0,7*2=14,7*2=14,2*2=4,9*2=18

第二步:1+2 + 1+0 + 1+2 + 0 + 1+4 + 1+4 + 4 + 1+8 = 30

30 + 2+9+5+8+1+7+0 = 62

第三步:10-2=8

所以,校验码是8,完整的卡号应该是6259650871772098。

值得指出的是,目前银联卡几乎都支持校验码算法,但是也不排除极个别不支持此算法的,如杭州银行早期发行的西湖卡。
望采纳祝你好运

8. 写一个oracle函数实现Luhn (模数10) 算法:传入一个数字类型字符串,对其进行Luhn校验生成校验位。

用以下函数实现
CREATE OR REPLACE FUNCTION generate_luhn (togen IN varchar)
RETURN number
IS
curval NUMBER := 0;
total NUMBER := 0;
everyother NUMBER := 1;
BEGIN
IF(
togen IS NULL
) then
RETURN 0;
end IF;

FOR i IN reverse 1 .. LENGTH(togen) loop
curval:=SUBSTR(togen, i, 1);
IF everyother = 1 then
everyother := 0;
curval := curval * 2;
IF(curval> 9) then
curval:=curval-9;
end IF;
else
everyother := 1;
end IF;

total := total + curval;
end loop;
IF MOD(total, 10) = 0 THEN
RETURN 0;
ELSE
RETURN 10 - MOD(total, 10);
END IF;
END generate_luhn;
/

阅读全文

与luhm算法相关的资料

热点内容
韩语编程语言 浏览:644
小程序开发如何租用服务器 浏览:78
怎么把钉钉文件夹保存到手机里 浏览:69
兵法pdf 浏览:643
app格式化下载不起怎么办 浏览:34
信捷加密文件是干嘛用的 浏览:952
su模型下载怎么解压不了 浏览:182
国际体验服如何把服务器改为亚服 浏览:880
手机怎么关闭视频加密 浏览:462
单片机编程存表法 浏览:719
富士康服务器是什么 浏览:452
编译是二进制吗 浏览:262
小程序账号登录源码 浏览:876
云南社保局app叫什么 浏览:697
美女程序员吃大餐 浏览:211
项目二级文件夹建立规则 浏览:560
dns使用加密措施吗 浏览:174
php独立运行 浏览:535
手机sh执行命令 浏览:731
云服务器的角色 浏览:737