python 实现Luhn (Mod 10)Algorithm算法

Luhn (Mod 10)Algorithm算法介绍

Luhn算法(也称为“模10”或Mod 10算法)是一种简单的校验和算法,主要用于验证身份识别码,如银行卡号、信用卡号、国际移动设备辨识码(IMEI)、美国国家提供商标识号码、加拿大社会保险号码等。该算法由IBM科学家Hans Peter Luhn创造,并于1954年申请专利,1960年颁证。

Luhn算法的具体操作步骤如下:

从右向左计数:从校验码(通常位于数字序列的最后一位,但在计算过程中暂时忽略)开始,从右向左计数每个数字的位置。

偶数位处理:对于位于偶数位(从右向左数,包括校验位在内的第二位、第四位等)的数字,将其乘以2。如果乘积是两位数,则将其个位和十位相加,得到一个单位数。

奇数位相加:对于位于奇数位(从右向左数,包括校验位在内的第一位、第三位等)的数字,直接将其相加。

求和并取模:将步骤2和步骤3中得到的所有数字相加,然后将总和取模10(即除以10取余数)。

计算校验码:用10减去步骤4中得到的余数,得到的结果即为校验码。如果余数为0,则校验码为0。

验证:将计算得到的校验码添加到原始数字序列的末尾,然后重新执行上述步骤(但这次包括校验码在内)。如果最终的和能够被10整除,则数字序列是有效的。

需要注意的是,Luhn算法并不是一种安全的加密哈希函数,它的设计目的是防止意外出错,而不是防止恶意攻击。此外,Luhn算法有其局限性,例如它不会检测到两位数序列09到90的转置(反之亦然),并且只能检测到10个可能的双误差中的7个。

在实际应用中,Luhn算法的实现可能会根据具体的编程语言而有所不同。例如,在Python中,可以使用类似下面的代码来实现Luhn算法:

def luhn_algorithm(card_num):"""实现Luhn/Mod10 算法的函数:param card_num: str, 需要验证的数字序列:return: bool, 如果数字序列有效则返回True,否则返回False"""# 移除可能的校验位并转换为整数列表digits = [int(d) for d in card_num[:-1]]odd_digits_sum = sum(digits[-i-1] for i in range(0, len(digits)-1, 2))even_digits_sum = sum((digits[-i-1] * 2 - 9) if digits[-i-1] * 2 > 9 else digits[-i-1] * 2for i in range(1, len(digits), 2))return (odd_digits_sum + even_digits_sum) % 10 == 0

请注意,上述代码仅用于说明目的,并未直接计算校验码,而是验证给定的数字序列(包括假定的校验码)是否满足Luhn算法的条件。如果您需要计算校验码,则需要在验证之前将其从数字序列中移除,并在验证后将计算得到的校验码与原始给定的校验码进行比较。

Luhn (Mod 10)Algorithm算法python实现样例

Luhn算法,也称为Mod 10算法,是用于验证一些身份证号码、信用卡号码等的有效性的算法。下面是一个Python实现:

def luhn_algorithm(number):# 将输入的数字字符串转换为整数列表digits = [int(x) for x in str(number)]# 从右向左,每隔一个数字乘以2for i in range(len(digits)-2, -1, -2):digits[i] = digits[i] * 2if digits[i] > 9:digits[i] = digits[i] - 9# 所有数字相加total = sum(digits)# 如果总和模10等于0,则有效if total % 10 == 0:return Trueelse:return False# 测试
number = input("请输入数字:")
is_valid = luhn_algorithm(number)
if is_valid:print(f"{number} 是有效的")
else:print(f"{number} 不是有效的")

这个算法的原理是,从右往左遍历输入数字的每一位,每隔一个数字将其乘以2。如果乘以2后的结果大于9,则将其减去9。然后将所有数字相加,如果总和模10等于0,则数字有效。

以上是一个基本的实现,您可以根据需要进行修改和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Rust 教程Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片(如 ESP32、ESP32-S2、ESP32-C3 等&#xff0…

TypeScript 算法手册 - 【冒泡排序】

文章目录 TypeScript 算法手册 - 冒泡排序1. 冒泡排序简介1.1 冒泡排序定义1.2 冒泡排序特点 2. 冒泡排序步骤过程拆解2.1 比较相邻元素2.2 交换元素2.3 重复过程 3. 冒泡排序的优化3.1 提前退出3.2 记录最后交换位置案例代码和动态图 4. 冒泡排序的优点5. 冒泡排序的缺点总结 …

Unity3D播放GIF图片使用Animation来制作动画

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…

计算机网络:计算机网络概述 —— 网络拓扑结构

文章目录 网络拓扑总线型拓扑特点缺陷 星型拓扑特点缺陷 环型拓扑特点缺陷 网状型拓扑优点缺陷 树型拓扑特点缺陷 网络拓扑 网络拓扑指的是计算机网络中节点(计算机、交换机、路由器等)之间物理或逻辑连接的结构。网络拓扑定义了节点之间的布局、连接方…

Python Linux解压安装脚本

本脚本用于安装python3.x, 需要指定python版本,如12代表3.12 安装文件下载自 python-build-standalone 我下载的文件后缀是:-x86_64-unknown-linux-gnu-pgo-full.tar.zst,根据需要自行下载 注意:install_only或tar.gz包的目录没有…

JAVA基础语法 Day11

一、Set集合 Set特点:无序(添加数据的顺序和获取出的数据顺序不一致),不重复,无索引 public class demo1 {public static void main(String[] args) {//1.创建一个集合//HashSet特点:无序,不重…

算法笔记(七)——哈希表

文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…

SpringBoot使用EasyPoi根据模板导出word or pdf

1、导出效果 1.1 wrod 1.2 pdf 2、依赖 <!--word--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version></dependency><dependency><groupId>cn.…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…

[SQL] SQL语句注意事项

语法: SQL可以单行或者多行书写&#xff0c;以分号结尾SQL可以使用空格/缩进来增强语句的可读性不区分大小写&#xff0c;但是关键字建议使用大写&#xff0c;这也是一个良好的习惯。注释&#xff1a;单行注释: -- 或者 # &#xff0c;#是MySQL特有的&#xff0c;建议统一使用…

Unity中Socket_TCP异步连接,加入断线检测以及重连功能

1、服务端 using System; using System.Collections.Generic; using System.Text; #region 命名空间 using System.Net; using System.Net.Sockets; using System.Threading; using UnityEngine; #endregionnamespace AsynServerConsole {/// <summary>/// Tcp协议异步通…

项目-坦克大战学习-爆炸特效消除

对于爆炸特效的消除有个非常简单的想法&#xff0c;给爆炸类设置一个bool检测是否爆炸完成&#xff0c;初始为false在爆炸特效4图片索引处检测&#xff0c;如果索引为4&#xff08;所有图片播放完成&#xff09;那么将bool改为true public bool isboomfalse; if(index4) { …

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针&#xff0c;所以我们可以直接使用一个指针来实现迭代器&#xff0c;但如下图可见迭代器有两个&#xff0c;一个是指向的内容可以被修改&#xff0c;另一个则是指…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包&#xff1a; swagger包&#xff1a;Swashbuckle.AspNetCore swagger包过滤器&#xff1a;Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

php与python建站的区别有哪些

php与Python建站的区别&#xff1a; 1、语言层面Python的特性比php好&#xff0c;更加规范。 2、Python的性能比php高。 3、有只需要启动服务的时候执行一次的代码&#xff0c;在php里每个请求都会被执行一次&#xff0c;Python不需要。虽然php可以通过缓存缩短这方面的差距…

Java题集(从入门到精通)04

此系列文章收录大量Java经典代码题&#xff08;也可以算是leetcode刷题指南&#xff09;&#xff0c;希望可以与大家一起努力学好Java。3、2、1&#xff0c;请看&#xff01; 目录 一、北京地铁计价程序 二、人名币兑换 三、各位数字之和 一、北京地铁计价程序 【问题描述…

【接口测试】任务1:登录接口

需要技能竞赛软件测试资料的同学们可s聊我&#xff0c;详细了解 任务实现要求 根据系统管理员—登录—接口API文档&#xff0c;编写接口测试用例&#xff0c;分别使用PostMan及JMeter进行接口测试&#xff0c;需要检查系统接口是否能正常工作&#xff0c;返回值是否正确&#…

RCE+[伪协议综合]

<aside> &#x1f4a1; 伪协议种类 </aside> **1 file:// — 访问本地文件系统 2 http:// — 访问 HTTP(s) 网址 3 ftp:// — 访问 FTP(s) URLs 4 php:// — 访问各个输入/输出流&#xff08;I/O streams&#xff09; 5 zlib:// — 压缩流 6 data:// — 数据&am…