Rust数字验证库verhoeff的使用,verhoeff提供高效校验和算法用于数字错误检测与验证
Rust数字验证库verhoeff的使用,verhoeff提供高效校验和算法用于数字错误检测与验证
Verhoeff算法是一种用于数字校验和的实现算法。虽然不如Luhn算法常见(例如在信用卡号中使用),但它确实有特定的应用场景,比如印度Aadhaar生物识别身份系统使用12位数字作为ID号码,其中最后一位就是Verhoeff校验和。
示例代码
以下是使用verhoeff库的基本示例:
use verhoeff::Verhoeff;
assert_eq!("12345".calculate_verhoeff_check_digit(), 1);
assert!(verhoeff::validate(&[1, 2, 3, 4, 5, 1]));
assert!(!"123456".validate_verhoeff_check_digit());
use verhoeff::VerhoeffMut;
let mut digits = vec![1, 2, 3, 4, 5];
digits.push_verhoeff_check_digit();
assert_eq!(digits, [1, 2, 3, 4, 5, 1]);
完整示例demo
// 引入verhoeff库
use verhoeff::{Verhoeff, VerhoeffMut};
fn main() {
// 示例1: 计算校验数字
let number = "12345";
let check_digit = number.calculate_verhoeff_check_digit();
println!("Number: {}, Check digit: {}", number, check_digit); // 输出: Number: 12345, Check digit: 1
// 示例2: 验证带有校验数字的完整号码
let full_number = [1, 2, 3, 4, 5, 1]; // 123451
let is_valid = verhoeff::validate(&full_number);
println!("Is {} valid? {}", format!("{:?}", full_number), is_valid); // 输出: Is [1, 2, 3, 4, 5, 1] valid? true
// 示例3: 直接验证字符串形式的号码
let invalid_number = "123456";
let is_valid = invalid_number.validate_verhoeff_check_digit();
println!("Is {} valid? {}", invalid_number, is_valid); // 输出: Is 123456 valid? false
// 示例4: 动态添加校验数字到向量
let mut digits = vec![9, 8, 7, 6]; // 9876
digits.push_verhoeff_check_digit();
println!("Number with check digit: {:?}", digits); // 输出: Number with check digit: [9, 8, 7, 6, 4]
}
Cargo.toml配置
标准使用方式:
[dependencies]
verhoeff = "1"
禁用std
功能但保留alloc
(不失去任何功能):
[dependencies]
verhoeff = { version = "1", default-features = false, features = ["alloc"] }
禁用std
功能且不启用alloc
(将失去VerhoeffMut
对String
和Vec<u8>
的实现):
[dependencies]
verhoeff = { version = "1", default-features = false }
Verhoeff算法提供了一种高效的数字错误检测与验证方法,适用于需要高可靠性数字验证的场景。通过简单的API,开发者可以轻松计算校验数字并验证数字序列的有效性。
1 回复
Rust数字验证库verhoeff的使用
介绍
verhoeff是一个Rust实现的Verhoeff校验和算法库,用于数字错误检测与验证。Verhoeff算法是一种高效的校验和算法,能够检测所有单一数字错误以及大多数常见的数字排列错误。
该算法由荷兰数学家Jacobus Verhoeff在1969年提出,比简单的Luhn算法(如信用卡号校验)更强大,能检测更多类型的错误。
使用方法
添加依赖
首先在Cargo.toml
中添加依赖:
[dependencies]
verhoeff = "0.2"
基本使用
use verhoeff::Verhoeff;
fn main() {
// 验证数字串的有效性
let valid_number = "2363";
let invalid_number = "2364";
println!("{} is valid: {}", valid_number, Verhoeff::validate(valid_number));
println!("{} is valid: {}", invalid_number, Verhoeff::validate(invalid_number));
// 为数字串生成校验位
let number = "236";
let check_digit = Verhoeff::generate_check_digit(number);
println!("Check digit for {} is: {}", number, check_digit);
// 生成带有校验位的完整数字
let full_number = Verhoeff::generate(number);
println!("Full number with check digit: {}", full_number);
}
处理大数字
use verhoeff::Verhoeff;
fn main() {
// 处理大数字作为字符串
let big_num = "12345678901234567890";
let check_digit = Verhoeff::generate_check_digit(big_num);
println!("Check digit for {} is: {}", big_num, check_digit);
// 验证大数字
let big_num_with_check = "123456789012345678902";
println!("Is valid: {}", Verhoeff::validate(big_num_with_check));
}
处理数字向量
use verhoeff::Verhoeff;
fn main() {
// 使用数字向量
let digits = vec![1, 2, 3, 4];
let check_digit = Verhoeff::generate_check_digit_from_digits(&digits);
println!("Check digit for {:?} is: {}", digits, check_digit);
// 验证数字向量
let digits_with_check = vec![1, 2, 3, 4, 1];
println!("Is valid: {}", Verhoeff::validate_digits(&digits_with_check));
}
完整示例
use verhoeff::Verhoeff;
fn main() {
// 示例1:基本验证
println!("=== 基本验证 ===");
let numbers = ["2363", "2364", "123451"];
for num in numbers.iter() {
println!("{} 是否有效: {}", num, Verhoeff::validate(num));
}
// 示例2:生成校验位
println!("\n=== 生成校验位 ===");
let numbers_to_check = ["236", "12345", "987654321"];
for num in numbers_to_check.iter() {
let check_digit = Verhoeff::generate_check_digit(num);
println!("数字 {} 的校验位是: {}", num, check_digit);
let full_number = Verhoeff::generate(num);
println!("完整数字(带校验位): {}", full_number);
}
// 示例3:处理大数字
println!("\n=== 处理大数字 ===");
let big_num = "12345678901234567890";
let check_digit = Verhoeff::generate_check_digit(big_num);
println!("大数字 {} 的校验位是: {}", big_num, check_digit);
let verified = format!("{}{}", big_num, check_digit);
println!("验证大数字 {}: {}", verified, Verhoeff::validate(&verified));
// 示例4:处理数字向量
println!("\n=== 处理数字向量 ===");
let digit_vecs = [
vec![1, 2, 3, 4],
vec![9, 8, 7, 6, 5],
vec![0, 1, 0, 1, 0, 1]
];
for digits in digit_vecs.iter() {
let check_digit = Verhoeff::generate_check_digit_from_digits(digits);
println!("数字向量 {:?} 的校验位是: {}", digits, check_digit);
let mut verified_digits = digits.clone();
verified_digits.push(check_digit);
println!("验证数字向量 {:?}: {}", verified_digits,
Verhoeff::validate_digits(&verified_digits));
}
}
应用场景
- 身份证号码校验:防止输入错误
- 产品序列号验证:确保序列号有效
- 金融系统:账户号码校验
- 数据录入系统:减少人工输入错误
性能特点
- 时间复杂度为O(n),适用于长数字串
- 轻量级实现,无额外依赖
- 能检测所有单一数字错误和大多数排列错误
注意事项
- 输入应为数字字符串或数字向量,包含非数字字符会导致错误
- 算法不适用于字母或其他字符的校验
- 空字符串或向量会被视为无效输入