我刚刚开始研究一个项目,在开始之前,我有一些关于peice的问题 我需要整理的代码,以及它将如何工作。
此代码将生成序列号,当通过算法运行时将等于 标识符。算法并不特别。
序列号需要分为4组5 :(最好是十六进制)
示例: 00A00-0B000-F00C0-0000D
标识符只是一组数字:
示例: 15456548
我想要创建的是一个脚本,可以将序列号中的十六进制数(array_sum?)一起添加到10,并且等于标识符(15456548)。该脚本需要创建尽可能多的序列号实例。
程序示例:
标识符: 22807.4
要制作的序列号: 2
序列号:
45154-54587-58458-69875
55457-45584-18658-49578
(这些序列号在加起来时除以标识符(22807.4)并除以10)
我不确定是否有人可以帮我提出一些事情,或者至少解释一下这个过程,但我以前从来没有在PHP中构建这样的东西。
答案 0 :(得分:2)
另一个样本。你需要添加一些东西。希望你在运行程序时能够意识到它们。
<?php
$num = '1234';
$serNums = findSerialNum(1234, 5);
echo var_export($serNums, true);
function findSerialNumSingle($num)
{
$serialNum = array();
$target = $num * 10;
// select some heuristic. We have to generate 5 sets. How shall we
// distribute the numbers between the 5 sets?
// Obviously one set can exceed the num * 10 itself.
// Lets select that as the heuristic, that the first number can be max that.
$remaining = $target;
$soFar = 0;
for($i = 0; $i < 5; $i++)
{
// select the entry that we would fill. Randomize it.
while(true)
{
$idx = rand(0, 4);
if(!isset($serialNum[$idx])) // is the entry already filled in?
break;
}
$t = rand(0, $target - $soFar); // find number between 0 and remain number
$serialNum[$idx] = $t;
$soFar += $t;
}
// put serial number is proper format
$s = '';
for($i = 0; $i < 5; $i++)
{
$s .= sprintf('%05X', $serialNum[$i]) . '-';
}
return $s;
}
function findSerialNum($num, $numInstances)
{
$serNums = array();
for($i = 0; $i < $numInstances; $i++)
{
while(true)
{
// loop till you find a distinct serial number
$t = findSerialNumSingle($num);
if(array_search($t, $serNums) == FALSE)
{
$serNums[$i] = $t;
break;
}
}
}
return $serNums;
}
?>
答案 1 :(得分:0)
以下代码将执行您正在寻找的内容,但不会对类型检查和确保参数与正确长度匹配做任何事情。例如,您需要确保string $serial
参数实际上采用'XXXXX-XXXXX-XXXXX-XXXXX'
格式。您还需要确保array $serial
参数由4个整数组成。
function TextSerialToIdentifier(string $serial) {
$a = str_split($serial, 5);
$b = array();
foreach($a as $v) {
array_push($b, intval($v, 16));
}
return ArraySerialToIdentifier($b);
}
function ArraySerialToIdentifier(array $serial) {
$id = 0;
foreach($serial as $i) {
$id += $i;
}
$id /= 10;
return intval($id);
}
function CreateSerial($id) {
$serial = '';
$id *= 10;
for($i = 0; $i < 5; $i++ ) {
$val = rand(0x00000, 0xFFFFF);
$id -= $val;
$serial = $serial . '-' . $val;
}
return substr($serial, 1);
}