揭秘 CPF 和 CNPJ 校验位算法:清晰简洁的方法

揭秘 cpf 和 cnpj 校验位算法:清晰简洁的方法

我清楚地记得我在本科学习期间第一次接触cpf(巴西id)验证算法。在申请米纳斯吉拉斯州联邦大学 ufmg 精确科学研究所实习时,我们被要求手写一段 java 代码,在简单解释算法后验证 cpf 校验位。

从那时起,我在不同的专业环境中多次遇到这个问题,经常求助于从互联网复制解决方案并添加一些单元测试。然而,每次,我都会对这些解决方案中反复出现的问题感到震惊。它们往往更植根于命令式范例,而不是预期的 java 代码面向对象方法。但是,更让我困扰的是,这些实现带来的高认知负荷使得阅读和理解代码的意图变得不切实际。

尚未需要实现此代码的感兴趣的开发人员可以轻松找到任何编程语言的解决方案。然而,它们都倾向于以相同的方式呈现:对 cpf 校验位如何实现的解释的简单复制。似乎很少有人花时间去理解这种方法背后的原因。

碰撞问题

在软件开发中,哈希码算法中经常会遇到碰撞避免的概念,特别是在使用素数模的情况下。 cpf(巴西id)和cnpj(巴西公司id)中的校验位功能类似,重点是避免冲突。这确保了简单的数字求和不会错误地验证不正确的条目,因为多种组合可以产生相同的总和。

为了缓解这种情况,常见的做法是应用加权和,将每个数字乘以一个特定的因子。您可以将其视为将数字沿一条线展开;乘法使得多个数字不太可能出现在同一位置。那么,数字在数字中的位置决定了它的权重,这是有道理的。

为了进一步增强可靠性并最大限度地降低碰撞风险,总和以 11 为模,然后从相同的素数中减去该结果。为了确保校验位仍然是个位数,10 和 11 的结果将转换为 0。

认知负荷

用于计算 cpf 和 cnpj 校验位的算法可能很难理解。虽然算法背后的总体动机可能很清楚,但掌握每个部分的具体作用通常具有挑战性。出现这种复杂性的部分原因是计算涉及一系列数学计算,这些计算通常集中在一个单一的大型方法中。此外,通常以莫名其妙的数组形式呈现的权重可能显得不合逻辑。

Waymark Waymark

Waymark是一个视频制作工具,帮助企业快速轻松地制作高影响力的广告。

Waymark 79 查看详情 Waymark

为了解决这个问题,我专注于减少缺乏自我解释的代码量。通过坚持单一职责原则(solid 中的“s”),我努力创建更简单、更易于理解的方法。我还努力通过有意义的变量名称来定义关键概念,旨在在代码库中建立一种普遍存在的语言。通过这种方法,我试图找出用于 cpf 校验位的方法与用于 cnpj 的方法的区别,因为需要一种方法的软件通常需要另一种方法。代码的核心功能如下所示,另外,要进一步查看,包括完整的代码和相关的单元测试,请访问我的 github 存储库。

  private string getcheckdigits(string document, int maxweight) {    final int lengthwithoutcheckdigits = getbasedigitslength(document);    int firstweightedsum = 0;    int secondweightedsum = 0;    for (int i = 0; i  9 ? 0 : checkdigit;  }  private int enhancecollisionavoidance(int weightedsum) {    final var weightsumlimit = 11;    return weightsumlimit - weightedsum % weightsumlimit;  }

将cnpj和cpf的校验位计算结果与网上找到的典型解决方案进行比较:

public class ValidaCNPJ {  public static boolean isCNPJ(String CNPJ) {// considera-se erro CNPJ's formados por uma sequencia de numeros iguais    if (CNPJ.equals("00000000000000") || CNPJ.equals("11111111111111") ||        CNPJ.equals("22222222222222") || CNPJ.equals("33333333333333") ||        CNPJ.equals("44444444444444") || CNPJ.equals("55555555555555") ||        CNPJ.equals("66666666666666") || CNPJ.equals("77777777777777") ||        CNPJ.equals("88888888888888") || CNPJ.equals("99999999999999") ||       (CNPJ.length() != 14))       return(false);    char dig13, dig14;    int sm, i, r, num, peso;// "try" - protege o código para eventuais erros de conversao de tipo (int)    try {// Calculo do 1o. Digito Verificador      sm = 0;      peso = 2;      for (i=11; i>=0; i--) {// converte o i-ésimo caractere do CNPJ em um número:// por exemplo, transforma o caractere '0' no inteiro 0// (48 eh a posição de '0' na tabela ASCII)        num = (int)(CNPJ.charAt(i) - 48);        sm = sm + (num * peso);        peso = peso + 1;        if (peso == 10)           peso = 2;      }      r = sm % 11;      if ((r == 0) || (r == 1))         dig13 = '0';      else dig13 = (char)((11-r) + 48);// Calculo do 2o. Digito Verificador      sm = 0;      peso = 2;      for (i=12; i>=0; i--) {        num = (int)(CNPJ.charAt(i)- 48);        sm = sm + (num * peso);        peso = peso + 1;        if (peso == 10)           peso = 2;      }      r = sm % 11;      if ((r == 0) || (r == 1))         dig14 = '0';      else dig14 = (char)((11-r) + 48);// Verifica se os dígitos calculados conferem com os dígitos informados.      if ((dig13 == CNPJ.charAt(12)) && (dig14 == CNPJ.charAt(13)))         return(true);      else return(false);    } catch (InputMismatchException erro) {        return(false);    }  }}

这段代码仅供cnpj使用!

结论

虽然结果代码可能显得有些冗长,但我对清晰度和自我解释的强调导致了我满意的结果。代码设计得更加直观,对其正确性提供了更大的信心,而且大多数核心功能无需向下滚动页面即可可见。

我欢迎任何进一步改进的建议,因此请随时分享您的反馈。

以上就是揭秘 CPF 和 CNPJ 校验位算法:清晰简洁的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1009481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 23:52:38
下一篇 2025年12月1日 23:53:10

相关推荐

  • DePIN是什么?全方位DePIN板块解析:最被低估的币圈板块

    Binance币安 欧易OKX ️ Huobi火币️ DePIN,全称是“去中心化物理基础设施网络”(Decentralized Physical Infrastructure Networks),简单说就是用区块链的方式,把现实世界里的硬件设备和基础设施组织起来,让普通人也能参与建设和分享收益。它…

    2025年12月11日
    000
  • DePIN项目爆发:去中心化基础设施网络引领新潮流

    Binance币安 欧易OKX ️ Huobi火币️ DePIN,全称去中心化物理基础设施网络,正成为2025年加密与科技交叉领域最引人注目的趋势之一。它不再只是区块链爱好者的概念玩具,而是开始真实地连接数字世界与物理设备,让普通人也能通过闲置资源参与并获益。 什么是DePIN?普通人如何从中受益 …

    2025年12月11日
    000
  • 一文秒懂:币圈DePIN知识详解

    Binance币安 欧易OKX ️ Huobi火币️ DePIN,全称去中心化物理基础设施网络,正成为连接现实世界与区块链的关键桥梁。它用加密激励让普通人也能参与建设基站、充电桩、算力中心等基础设施,并从中获得收益。这个模式不仅改变了传统基建由大公司垄断的局面,还创造了全新的财富分配方式。 什么是D…

    2025年12月11日
    000
  • 新手交易前应该了解的币圈k线图大全

    Binance币安 欧易OKX ️ Huobi火币️ 刚接触币圈交易,面对K线图一头雾水?别担心,看懂K线是每个交易者必经的第一步。它不神秘,就是把一段时间内的价格波动画成一根根“蜡烛”,记录下开盘、收盘、最高、最低四个关键价位。搞明白这根“蜡烛”长什么样,你就掌握了市场情绪的密码。 认识K线的基本…

    2025年12月11日
    000
  • DePIN赛道是什么?一文解密DePIN生态

    Binance币安 欧易OKX ️ Huobi火币️ DePIN赛道,全称“去中心化物理基础设施网络”(Decentralized Physical Infrastructure Networks),简单来说就是用区块链和代币激励的方式,把现实世界里的硬件资源连接起来,形成一个由普通人共同拥有和维护…

    2025年12月11日
    000
  • 币圈交割合约全解析:机制、差异与实战策略

    Binance币安 欧易OKX ️ Huobi火币️ 说到币圈的交割合约,很多人第一反应是“高风险”、“看不懂”。其实只要搞清楚它的运行机制和与其他合约的区别,再结合一些实用策略,就能更理性地参与。交割合约不是洪水猛兽,关键在于你如何使用它。 交割合约是怎么回事? 交割合约本质上是一种有明确到期时间…

    2025年12月11日
    000
  • 币圈合约是什么意思,有哪些类型?币圈新手合约入门教程

    Binance币安 欧易OKX ️ Huobi火币️ 币圈合约,简单说就是一种预测加密货币价格涨跌的金融工具。你不用真买下比特币或以太坊,也能从中赚差价。它像一场对赌,你和市场其他参与者押注价格走向,赢了拿钱,输了赔钱。 合约有哪些类型? 主要分两种,区别在于有没有“截止日期”: 永续合约:最常见的…

    2025年12月11日
    000
  • 币安交易平台官网入口 币安官方最新版v3.3.1APP下载安装

    为了安全、便捷地进行数字资产交易,请务必通过币安官方网站入口下载并安装最新版的app。本文将为您详细介绍币安官方最新版v3.3.1 app的安装后注册及安全设置全流程。 币安官网直达: 币安官方app: 一、 币安APP下载与新用户注册 1、首先,通过官方渠道下载并安装币安App后,打开应用并点击主…

    2025年12月11日 好文分享
    000
  • 如何查询比特币合约的交易记录?比特币合约交易记录查询方法

    查询比特币合约的交易记录,是每位投资者进行资产复盘、策略优化和风险管理的关键步骤。了解如何有效查询这些记录,不仅能确保交易的透明性,还能为未来的投资决策提供有力的数据支持。 通过主流交易所平台直接查询 1、登录账户后台查找:这是最直接便捷的方法。用户只需登录自己的交易平台账户,通常在“资产”、“订单…

    2025年12月11日
    000
  • 如何调整以太坊合约的委托价格?以太坊合约委托价格调整方法

    在以太坊网络上,当您提交的合约交易因设置的委托价格(即Gas费用)过低而长时间未被矿工打包确认时,可以通过提高Gas费来加速处理。这本质上是用一笔新的、更高费用的交易来替换掉原来那笔卡住的交易。 了解核心的Gas费用机制 1、在调整价格前,必须理解Gas费的构成。对于传统交易,关键是Gas Pric…

    2025年12月11日
    000
  • 如何查看狗狗币合约的交易历史?狗狗币合约交易历史查看方法

    查询狗狗币的交易历史其实非常直接,因为其所有交易记录都公开透明地记录在区块链上。任何人都可以通过特定工具来查看这些信息,确保了整个网络的可追溯性和安全性。 通过区块链浏览器查询 1、首先,你需要选择一个可靠的狗狗币区块链浏览器。常用的选择包括Dogechain、Blockchair或SoChain等…

    2025年12月11日
    000
  • 如何查看狗狗币合约的未平仓量?狗狗币合约未平仓量查看方法

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 了解狗狗币合约的未平仓量是洞察市场情绪和资金流向的关键。它代表市场中所有未平仓合约的总和,其变化能帮助投资者判断趋势强度。 通过主流加密货币交易所查询 1、多数主流…

    2025年12月11日
    000
  • 如何设置狗狗币合约的触发价格?狗狗币合约触发价格设置指南

    在狗狗币合约交易中,合理设定触发价格是控制风险、锁定利润的关键一步。触发价格是指当市场价格达到您预设的某个点位时,系统会自动为您提交一个预设的委托订单,帮助您在波动的市场中执行交易策略。 理解触发价格的三种基础类型 1、最新成交价:这是指在当前交易所上最新一笔成交的价格。它的反应最灵敏,但同时也最容…

    2025年12月11日
    000
  • 2026最具有潜力的虚拟货币排行榜(榜单前十名汇总)

    随着数字资产市场的不断成熟,爱好者们都在寻找下一个具有巨大增长潜力的项目。本文旨在梳理并介绍截至2026年,在技术创新、生态系统发展和市场应用方面展现出强大潜力的十大虚拟货币。这份榜单将为您提供一个清晰的参考框架,帮助您了解未来市场的重要趋势。 2026虚拟货币交易平台推荐 1、欧易okx 官网入口…

    2025年12月11日 好文分享
    000
  • Bitget交易所新手入门:合约交易操作教程和防爆仓指南

    目录 Bitget合约交易操作教程新手入门:合约交易防爆仓指南一、理解合约爆仓的本质二、防爆仓的四大内核策略三、特殊爆仓场景及应对方案四、爆仓常见问题解答(FAQ)五、总结与建议 合约交易因其高杠杆特性具有极高的风险,爆仓(帐户资金被清零或强制平仓)是交易者最需警惕的风险。本指南将系统性介绍如何使用…

    2025年12月11日 好文分享
    000
  • o易充币地址是什么?如何管理充币地址?o易充币地址操作教学

    欧易充币地址的核心要点 欧易(OKX)平台的充币地址是您接收数字货币的专属入口,由一串唯一的字符和数字构成,对应特定的加密货币类型。每个地址都具备唯一性,并与具体的币种及区块链网络绑定,这意味着: 币种专用:例如,您的 BTC 充值地址仅限用于接收比特币(BTC)。若向该地址转入其他代币(如 ETH…

    2025年12月11日 好文分享
    000
  • 币安binance交易平台官网地址 – 虚拟货币官方网站

    币安(binance)是全球领先的虚拟货币交易平台,为广大用户提供安全、稳定、便捷的数字资产交易服务。要开始您的虚拟货币投资之旅,第一步就是访问其官方平台并创建一个账户。以下将通过币安app为您详细介绍官方平台的注册及安全设置流程。 币安官网直达: 币安官方app: 一、 币安官方平台账户注册指南 …

    2025年12月11日 好文分享
    000
  • 币an交易平台官网入口 币安官方最新版v3.3.0APP下载安装

    为了安全、便捷地进行数字资产交易,请务必通过币安官方网站入口下载并安装最新版的app。本文将为您详细介绍币安官方最新版v3.3.0 app的安装后注册及安全设置全流程。 币安官网直达: 币安官方app: 一、 币安APP下载与新用户注册 1、首先,通过官方渠道下载并安装币安App后,打开应用并点击主…

    2025年12月11日 好文分享
    000
  • btc合约订单类型有哪些 一文了解btc合约订单类型种类

    在数字资产合约交易中,熟练运用不同类型的订单是执行交易策略、控制风险的关键。了解各种订单的功能和适用场景,能帮助交易者更精准地把握市场时机,实现交易目标。 一、基础订单类型 1、限价单 (Limit Order):这是最基础的订单类型。用户可以设定一个具体的买入或卖出价格,只有当市场价格达到或优于这…

    2025年12月11日
    000
  • 狗狗币 ETF DOJE 上市:迷因币踏入华尔街,价格走势如何?一文详解

    狗狗币(Dogecoin),这一最初以迷因(meme)形式诞生的加密货币,如今正经历着前所未有的华尔街之旅。随着狗狗币ETF DOJE的正式上市,一个全新的时代似乎正在开启,它不仅标志着迷因币类资产在主流金融市场中的地位得到认可,更引发了市场对于其未来价格走势的广泛关注。从社区驱动的数字玩笑,到机构…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信