[技术栈]C#利用Luhn算法(模10算法)对IMEI校验

1、Luhn算法(模10算法)

通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图:


算法主要分为三步:
第一步:从右边第一位(最低位)开始隔位乘2;
第二步:把第一步所得的每一个数字加入到原来的数中,比如9*2=18,为1+8
第三步:用以0结尾且大于第二步所获得的数的和的最小整数减去第二步所获得的合即可以获得校验位,如70-67=3,3即为校验位,如果第二步所有数字的和以0结尾,比如30、40、50等,那么校验为0;

2、IMEI校验

IMEI码由GSM(Global System for Mobile Communications,全球移动通信协会)统一分配,授权BABT(British approvals Board of Telecommunications,英国通信认证管理委员会)审受。
TS.06 IMEI Allocation and Approval Process中规定IMEI校验应该通过Luhn算法计算,如下图所示:

3、C#代码
------

public class LuhnCalcCheckDigit
{

    /// <summary>
    /// 通过Luhn算法计算校验位,适合IMEI、银行卡等
    /// </summary>
    /// <param name="imei">不包含校验位的号码</param>
    /// <returns></returns>
    public static int CalcLuhnCheckDigit(string imei)
    {
        int checkDigit = 0;
        int addValue = 0;
        for (int i = 0; i < imei.Length; i++)
        {
            if (i % 2 == 0)
            {
                int result = Convert.ToInt32(imei[imei.Length - i - 1].ToString()) * 2;
                if (result > 9)
                {
                    addValue += (result - 9);
                }
                else
                {
                    addValue += result;
                }
            }
            else
            {
                addValue += Convert.ToInt32(imei[imei.Length - i - 1].ToString());
            }
        }

        if (addValue % 10 == 0)
        {
            checkDigit = 0;
        }
        else
        {
            checkDigit = 10 - addValue % 10;
        }
        return checkDigit;
    }

    /// <summary>
    /// 通过Luhn算法核验号码是否合法,适合IMEI、银行卡等
    /// </summary>
    /// <param name="imei">包含校验位的号码</param>
    /// <returns></returns>
    public static bool VerifyLuhn(string imei)
    {
        int checkDigit = 0;
        int addValue = 0;
        for (int i = 1; i < imei.Length; i++)
        {
            if (i % 2 == 1)
            {
                int result = Convert.ToInt32(imei[imei.Length - i - 1].ToString()) * 2;
                if (result > 9)
                {
                    addValue += (result - 9);
                }
                else
                {
                    addValue += result;
                }
            }
            else
            {
                addValue += Convert.ToInt32(imei[imei.Length - i - 1].ToString());
            }
        }
        if (addValue % 10 == 0)
        {
            checkDigit = 0;
        }
        else
        {
            checkDigit = 10 - addValue % 10;
        }
        return (checkDigit - Convert.ToInt32(imei[imei.Length - 1].ToString())) == 0;
    }

}

4、参考资料链接

TS.06 IMEI Allocation and Approval Process
ISO/IEC 7812-1:2017

原文地址:https://www.cnblogs.com/mjoin/p/11595896.html

时间: 2024-07-30 08:54:28

[技术栈]C#利用Luhn算法(模10算法)对IMEI校验的相关文章

银行卡号码的校验规则(Luhn算法/模10算法)

银行卡校验 可以用于前端需要用户输入银行卡时做初步校验 银行卡号码的校验采用Luhn算法,校验过程大致如下: 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3-. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回. 如果s能够整除10,则此号码有效,否则号码无效.

java技术栈

java技术栈 1 java基础: 1.1 算法 1.1 排序算法:直接插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序 1.2 二叉查找树.红黑树.B树.B+树.LSM树(分别有对应的应用,数据库.HBase) 1.3 BitSet解决数据重复和是否存在等问题 1.2 基本 2.1 字符串常量池的迁移 2.2 字符串KMP算法 2.3 equals和hashcode 1.equals方法用于比较对象的内容是否相等(覆盖以后) 2.hashcode方法只有在集合中

基于Python技术栈的算法落地踩坑

背景介绍 在一些业务场景,我们需要把离线训练好的模型以微服务部署线上,如果是简单的使用sklearn pipeline,可以保存为XML格式的pmml供Java调用,在配置为4 core,8G内存的docker环境可以提供8K左右的高并发,并且这种docker可以快速大规模部署到PaaS云平台,优势相当明显,实际情况是算法人员会基于Python自定义lambda处理数据,而自定义的lambda是很难保存到pmml中的,并且很多公司的算法团队也是要求基于Python技术栈是 落地的. 踩坑过程 算

各大公司容器云的技术栈对比

郑昀编著于2015/10/20 目前来看,几家历史包袱较重的公司都选择不让上层应用感知到底层是 VM 还是容器,所以都改了 docker 内核,如360.点评.汽车之家.最后附上我们的容器私有云技术栈以及系统截图. 点评容器技术栈 2014年启动基于 docker 搭建私有云,之前谈不上使用过私有云 运维工具:Puppet NATS+Nginx+Zookepper: 组件之间的交互使用了 NATS,通过消息的『发布-订阅』模型,将各个组件之间的耦合最小化 对于Web类型的应用,通过和 Nginx

机器学习的技术栈及应用实例脑洞

之前写了一篇入门级的学习列表: 简单粗暴地入门机器学习 好多小伙伴觉得不太过瘾,今天补充一些脑洞! 本文结构: 机器学习技术栈 职位 项目实例 1. 机器学习技术栈 去知乎上可以搜到很多推荐的学习路线,问题就是太多了,我就先列出一些必需的知识和项目方向,学习还是要一步一步积累的. 需要的基础技能: Various level of math, including probability, statistics, algebra, calculus, logic and algorithms. B

再谈&lt;全栈必备的技术栈设想&gt;一文

在SDCC2016的架构师进阶之路主题,我分享了<老曹眼中的全栈架构师>话题,会后在csdn博客发布了<全栈必备的技术栈设想>一文,在我的公众号(wireless_com)发的是<全栈的技术栈设想>.然后,有幸得到了中生代技术(freshmanTechnology)和多人的转载,中生代技术还专门开通了全栈架构师深度讨论群,引起了很多的争论和争议. 主要分为以下三种观点: 1)根本没有意义,纯属忽悠 如网友回复:"鬼都知道说的什么 数据 缓存 业务 性能 消息队

C#生成模10检验位

以下摘自维基百科 "http://zh.wikipedia.org/wiki/Luhn%E7%AE%97%E6%B3%95" Luhn算法(Luhn algorithm),也称为"模10"(Mod 10)算法,是一种简单的校验和算法,一般用于验证身份识别码,例如发卡行识别码.国际移动设备辨识码(IMEI),美国国家提供商标识号码,或是加拿大社会保险号码.. 该算法现已属于公有领域并得到了广泛的应用,它不是一种安全的加密哈希函数,设计它的目的只是防止意外出错而不是恶意

大型网站架构演变史(含技术栈与价值观)

这篇文章是参考李智慧的<大型网站技术架构:核心原理与案例分析>和现蘑菇街CTO曽宪杰的<大型网站系统与Java中间件实践>写的一篇读书笔记. 前言 何谓大型网站?大型网站的特点是什么?大型网站架构发生演变的源动力是什么?大型网站的架构演变经历了哪些阶段?在演变的某个具体阶段使用到常用技术有哪些,为什么要使用这些技术,同时这些技术又解决了什么问题?笔者在初次接触大型网站时思考了以上几个问题,本着缘木求鱼的方式,我打算详细的扒一扒大型网站的演变史.如果对以上的几个问题都理解透彻了,那么

利用Red Blob游戏介绍A*算法

转自:http://gad.qq.com/program/translateview/7194337 在游戏中,我们经常想要找到从一个位置到另一个位置的路径.我们不只是想要找到最短距离,同时也要考虑旅行时间.如下图中从星星(起点)到叉号(终点)的最短路径. 为了找到这样的路径,我们可以使用一种图搜索算法,它需要将地图表示为一张图.A *算法是图形搜索的热门选择.宽度优先搜索是图形搜索算法中最简单的一种,所以让我们从这个算法开始,慢慢扩展到A*算法. 地图的表示 研究算法时,首先要了解数据.输入是