1

プロジェクトに取り組み始めたばかりですが、始める前に、まとめる必要があるコードと、それがどのように機能する必要があるかについていくつか質問があります。

このコードは、アルゴリズムを実行すると識別子に等しいシリアル番号を生成します。アルゴリズムは特別なものではありません。


シリアル番号は、5 の 4 つのセットに分割する必要があります: (できれば 16 進数)
例: 00A00-0B000-F00C0-0000D

識別子は 1 セットの数字になります:
例: 15456548

私が作成しようとしているのは、シリアル番号の 16 進数を一緒に追加 (array_sum?) し、10 で割り、識別子 (15456548) に等しいスクリプトです。スクリプトは、私が指示した数のシリアル番号のインスタンスを作成する必要があります。


プログラム例:

識別子: 22807.4 作成
するシリアル番号の数: 2

シリアル番号:
45154-54587-58458-69875
55457-45584-18658-49578

(これらのシリアル番号を合計して 10 で割ると、識別子 (22807.4) と等しくなります)

誰かが何かを考え出すのを手伝ってくれるか、少なくともプロセスを説明してくれるかどうかはわかりませんが、PHP でこのようなものを構築したことはありません。

4

2 に答える 2

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;
    }
?>
于 2013-01-11T06:46:29.193 に答える
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);
}
于 2013-01-11T05:47:37.157 に答える