用于测试的有效随机CPF生成器工具
生成有效的随机CPF(Cadastro de Pessoas Físicas)号码用于测试目的。此工具创建符合官方巴西格式和验证规则的CPF,而不使用任何真实的个人信息。
生成 CPF
📚
文档
CPF 生成器
介绍
CPF(Cadastro de Pessoas Físicas)是分配给巴西公民和居民的唯一标识符,用于税务目的。此生成器创建有效的随机 CPF 号码供测试使用。请注意,这些生成的 CPF 不与真实个人相关联,仅应在测试环境中使用。
CPF 的结构
CPF 由 11 位数字组成:
- 前 9 位是基本数字
- 最后 2 位是校验位
格式通常表示为:XXX.XXX.XXX-XX
CPF 验证算法
CPF 验证算法确保号码的完整性。其工作原理如下:
- 将前 9 位数字乘以权重(10 到 2)
- 求和结果
- 计算和除以 11 的余数
- 如果余数小于 2,第一个校验位为 0;否则为 11 减去余数
- 对前 10 位数字(包括第一个校验位)重复该过程,权重为 11 到 2
- 使用与第一个校验位相同的规则计算第二个校验位
如何使用此生成器
- 点击“生成 CPF”按钮
- 将显示有效的随机 CPF
- 您可以复制生成的 CPF 用于测试场景
公式
生成有效 CPF 的公式如下:
1def generate_cpf():
2 # 生成 9 位随机数字
3 base_cpf = [random.randint(0, 9) for _ in range(9)]
4
5 # 计算第一个校验位
6 sum_1 = sum((10 - i) * digit for i, digit in enumerate(base_cpf))
7 check_digit_1 = (sum_1 * 10 % 11) % 10
8
9 # 计算第二个校验位
10 sum_2 = sum((11 - i) * digit for i, digit in enumerate(base_cpf + [check_digit_1]))
11 check_digit_2 = (sum_2 * 10 % 11) % 10
12
13 return base_cpf + [check_digit_1, check_digit_2]
14
计算
生成器执行以下步骤:
- 生成 9 位随机数字
- 使用上述算法计算第一个校验位
- 计算第二个校验位
- 将所有数字组合成完整的 CPF
示例
以下是一些生成的 CPF 示例:
- 123.456.789-09
- 987.654.321-00
- 111.222.333-96
用例
CPF 生成器在各种软件开发和测试场景中非常有用:
- 数据库测试:用有效的 CPF 号码填充测试数据库
- 表单验证:测试巴西用户注册表单的输入验证
- API 测试:在需要有效巴西身份证明的 API 请求中使用生成的 CPF
- 性能测试:生成大量唯一有效的 CPF 进行负载测试
- UI/UX 测试:确保用户界面中 CPF 号码的适当格式和显示
替代方案
虽然 CPF 是巴西的主要个人标识符,但在特定情况下可能会使用其他标识符:
- RG(Registro Geral):州颁发的身份证明文件
- CNPJ(Cadastro Nacional da Pessoa Jurídica):用于企业和法人实体
- PIS/PASEP:用于与就业相关的目的
历史
CPF 于 1965 年在巴西引入,作为现代化国家税制的一部分。最初,它主要用于所得税目的,但随着时间的推移,其使用范围扩展到巴西官僚机构和商业的各个领域。
CPF 历史上的关键里程碑:
- 1965:为个人引入 CPF
- 1972:CPF 成为所有纳税个人的强制性要求
- 1990 年代:CPF 开始在商业和金融交易中更广泛使用
- 2000 年代:数字系统进一步将 CPF 整合到巴西人的日常生活中
如今,CPF 是巴西公民和居民与政府服务、金融机构以及许多商业交易互动的重要组成部分。
代码示例
以下是用各种编程语言生成和验证 CPF 的代码片段:
1import random
2
3def generate_cpf():
4 cpf = [random.randint(0, 9) for _ in range(9)]
5 for _ in range(2):
6 value = sum((cpf[num] * ((len(cpf) + 1) - num) for num in range(len(cpf)))) % 11
7 cpf.append(11 - value if value > 1 else 0)
8 return ''.join(map(str, cpf))
9
10def validate_cpf(cpf):
11 numbers = [int(digit) for digit in cpf if digit.isdigit()]
12 if len(numbers) != 11 or len(set(numbers)) == 1:
13 return False
14 for i in range(9, 11):
15 value = sum((numbers[num] * ((i + 1) - num) for num in range(i))) % 11
16 if numbers[i] != (11 - value if value > 1 else 0):
17 return False
18 return True
19
20## 示例用法
21cpf = generate_cpf()
22print(f"生成的 CPF: {cpf}")
23print(f"是否有效: {validate_cpf(cpf)}")
24
1function generateCPF() {
2 const cpf = Array.from({length: 9}, () => Math.floor(Math.random() * 10));
3 for (let i = 0; i < 2; i++) {
4 let sum = cpf.reduce((acc, cur, idx) => acc + cur * (cpf.length + 1 - idx), 0);
5 let digit = 11 - (sum % 11);
6 cpf.push(digit > 9 ? 0 : digit);
7 }
8 return cpf.join('');
9}
10
11function validateCPF(cpf) {
12 const numbers = cpf.match(/\d/g).map(Number);
13 if (numbers.length !== 11 || new Set(numbers).size === 1) return false;
14 for (let i = 9; i < 11; i++) {
15 let sum = numbers.slice(0, i).reduce((acc, cur, idx) => acc + cur * (i + 1 - idx), 0);
16 let digit = 11 - (sum % 11);
17 if (numbers[i] !== (digit > 9 ? 0 : digit)) return false;
18 }
19 return true;
20}
21
22// 示例用法
23const cpf = generateCPF();
24console.log(`生成的 CPF: ${cpf}`);
25console.log(`是否有效: ${validateCPF(cpf)}`);
26
1import java.util.Random;
2
3public class CPFGenerator {
4 private static final Random random = new Random();
5
6 public static String generateCPF() {
7 int[] cpf = new int[11];
8 for (int i = 0; i < 9; i++) {
9 cpf[i] = random.nextInt(10);
10 }
11 cpf[9] = calculateCheckDigit(cpf, 10);
12 cpf[10] = calculateCheckDigit(cpf, 11);
13 return formatCPF(cpf);
14 }
15
16 private static int calculateCheckDigit(int[] cpf, int factor) {
17 int sum = 0;
18 for (int i = 0; i < factor - 1; i++) {
19 sum += cpf[i] * (factor - i);
20 }
21 int result = 11 - (sum % 11);
22 return result > 9 ? 0 : result;
23 }
24
25 private static String formatCPF(int[] cpf) {
26 return String.format("%d%d%d.%d%d%d.%d%d%d-%d%d",
27 cpf[0], cpf[1], cpf[2], cpf[3], cpf[4], cpf[5], cpf[6], cpf[7], cpf[8], cpf[9], cpf[10]);
28 }
29
30 public static boolean validateCPF(String cpf) {
31 cpf = cpf.replaceAll("[^0-9]", "");
32 if (cpf.length() != 11) return false;
33 int[] numbers = cpf.chars().map(Character::getNumericValue).toArray();
34 if (allEqual(numbers)) return false;
35 int digit10 = calculateCheckDigit(numbers, 10);
36 int digit11 = calculateCheckDigit(numbers, 11);
37 return numbers[9] == digit10 && numbers[10] == digit11;
38 }
39
40 private static boolean allEqual(int[] array) {
41 for (int i = 1; i < array.length; i++) {
42 if (array[i] != array[0]) return false;
43 }
44 return true;
45 }
46
47 public static void main(String[] args) {
48 String cpf = generateCPF();
49 System.out.println("生成的 CPF: " + cpf);
50 System.out.println("是否有效: " + validateCPF(cpf));
51 }
52}
53
这些示例演示了如何在 Python、JavaScript 和 Java 中生成和验证 CPF。您可以根据具体需求调整这些函数或将其集成到需要 CPF 处理的更大系统中。
法律和伦理考虑
使用生成的 CPF 时,务必牢记以下几点:
- 生成的 CPF 仅用于测试目的,不得用于冒充真实个人或进行任何欺诈活动。
- 清楚标记任何包含生成 CPF 的测试数据,以防与真实个人数据混淆。
- 在处理假个人标识符时,了解您所在司法管辖区的数据保护法律和法规。
- 在生产环境中,始终使用用户提供的真实、经过验证的 CPF 或授权来源提供的 CPF。
- 实施适当的安全措施,以保护系统中真实和生成的 CPF。
参考文献
- Receita Federal do Brasil. "CPF - Cadastro de Pessoas Físicas." https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/cadastros/cpf
- Serpro. "Validador de CPF." https://www.serpro.gov.br/links-fixos-superiores/validador-cpf
- Ministério da Fazenda. "历史 CPF." https://www.gov.br/fazenda/pt-br/assuntos/receita-federal
- Lei nº 4.862, de 29 de novembro de 1965. "改变所得税法,采用各种财政和税务措施,并作其他规定。"
💬
反馈
💬
点击反馈提示开始给这个工具反馈