php - 如何使用沙特 ID 格式生成和验证随机 ID?
问题描述
我需要生成随机 ID,以根据此问题中显示的沙特 ID 标准进行验证:
我试过以下代码:
$random_numbers = [];
while(count($random_numbers) < 1000000000){
do {
$random_number = mt_rand(1000000000,9000000000);
}
while (in_array($random_number, $random_numbers));{
$type = substr ( $random_number, 0, 1 );
if($type != 2 && $type != 1 ) break;
$sum = 0;
for( $i = 0 ; $i<10 ; $i++ ) {
if ( $i % 2 == 0){
$ZFOdd = str_pad ( ( substr($random_number, $i, 1) * 2 ), 2, "0", STR_PAD_LEFT );
$sum += substr ( $ZFOdd, 0, 1 ) + substr ( $ZFOdd, 1, 1 );
}else{
$sum += substr ( $random_number, $i, 1 );
}
}
return $sum%10 ? break : echo $random_number;
----------
echo "<br>";
$random_numbers[] = $random_number;}
}
解决方案
免责声明: 我不能 100% 确定沙特身份证号码所需的验证等,并且只简要查看了链接问题中提供的答案
好的,所以,我的理解是您需要生成一个随机 id:
匹配模式/格式:
[12]\d{9}
根据链接问题中显示的标准进行验证:
为此,我们需要创建几个函数;一种用于生成 ID,另一种用于根据给定标准验证 ID。
生成标识
简单地生成一个 ID 就足够简单了。我们可以random_int
在 PHP 中使用带有循环的函数。如果我们将生成 ID 的代码包含在do...while...
循环中,那么我们可以执行代码并重复验证 ID,直到我们得到一个有效的 ID。
function getRandomSaudiId() : int
{
do {
$saudiId = (string) random_int(1,2);
for($i = 0; $i < 9; $i++){
$saudiId .= random_int(0,9);
}
} while(validateSaudiId($saudiId) === false);
return (int) $saudiId;
}
验证身份证
注意:我们转换为,string
以便我们可以根据索引访问数字。
function validateSaudiId(string $id) : bool
{
$sum = 0;
for($i = 0; $i < 9; $i++){
if( $i % 2 ){
// Even number
$sum += $id[$i];
}
else{
//Odd number
$increment = $id[$i] * 2;
while($increment > 9){
$increment = (string) $increment;
$increment = $increment[0] + $increment[1];
}
$sum += $increment;
}
}
$sum = (string) $sum;
return ($sum[1] == $id[9] || $id[9] == (10 - $sum[1])) ? true : false;
}
示例使用
for($i = 0; $i < 10; $i++) var_dump(getRandomSaudiId());
/*
Output:
int(2933617506)
int(2409806096)
int(1072585118)
int(2891306413)
int(1810304558)
int(2591965856)
int(1363032527)
int(1031823269)
int(1265954048)
int(2498099472)
int(1134172537)
*/
推荐阅读
- javascript - three.js Box3.min 和 max localToWorld
- scala - 如何修复所有错误并成功运行 Akka Distributed Workers 示例项目?
- python - 按下 Enter 时获取 tkinter 列表框选定项,然后关闭
- multithreading - Delphi Parallel For 自定义线程
- react-native - 如何从 react-native 0.57 迁移到 0.60 或更高版本?
- java - 我如何使用java中的客户端服务器套接字编程通过网络流式传输镶木地板文件
- c++ - 在 VM 中运行 GDB 的变量已优化或不可用
- python - 谷歌表格 api 过滤器功能不起作用?
- amazon-web-services - 用于 tensorflow 和 pymysql 的 Sagemaker 内核
- authentication - 如何在 Payara 5.193 中配置数据网格 ttl