在PHP中使用算法生成序列号


Generate Serial Numbers with an algorithm in PHP

我刚开始做一个项目,在我开始之前,我有几个关于项目的问题我需要放在一起的代码,以及它需要如何工作。

此代码将生成序列号,当通过算法运行时将等于一个标识符。这个算法没什么特别的。


序列号需要分成4组,每组5个:(最好是十六进制)
例子: 00 a00 - 0 - b000 f00c0 - 0000 d

标识符将只是一组数字:
例子: 15456548

我要创建的是一个脚本,可以添加(array_sum?)十六进制在一个序列号一起,由10潜水,等于标识符(15456548)。脚本将需要创建尽可能多的序列号实例,因为我告诉它。


程序示例:

标识符: 22807.4
要制作多少个序列号: 2

序列号:
45154-54587-58458-69875
55457-45584-18658-49578

(这些序列号相加并除以10等于标识符(22807.4))

我不确定是否有人能帮我想出一些东西,或者至少解释一下这个过程,但我从来没有在PHP中构建过这样的东西。

另一个示例。你需要添加一些东西。希望您在运行程序时能够意识到它们。

<?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;
    }
?>

下面的代码将完成您所寻找的工作,但是没有进行类型检查和确保参数匹配适当的长度。例如,您需要确保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);
}