ホームページ  >  記事  >  バックエンド開発  >  (上級) PHP は固有の会員カード番号を生成します

(上級) PHP は固有の会員カード番号を生成します

黄舟
黄舟オリジナル
2017-02-07 10:05:451568ブラウズ

文字 Z は 35 を表すなど、値 0 ~ 35 をそれぞれ表すために 0 ~ Z (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) を使用します。この場合、5 桁の数値を取得したいのですが、最大の情報量は 36 の 5 乗、36^5 = 60466176 です。つまり、最大 5 桁の数値は 10 進数に相当します: 60466176。 。

この記事ではデモンストレーションのために、クラブが 10 桁の会員カード番号のバッチを発行すると仮定します。会員カード番号は、3 桁の都市番号 + 5 桁のカード番号コード + 2 桁で構成されます。コードをチェックしてください。都市番号は市外局番で表されます。たとえば、755 は深センを表します。次の 2 つのチェック コードは、特定のアルゴリズムによって生成されます。コードはカード番号が正当であることを確認するためのものです。この場合、当社が生成する10桁のカード番号は最大6,000万件以上の会員カード番号に相当し、重複のない唯一のカード番号となります。


PHPを使用して10進数を16進数に変換します。

class Code { 
    //密码字典 
    private $dic = array( 
        0=>'0',    1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5', 6=>'6', 7=>'7', 8=>'8',     
        9=>'9', 10=>'A',  11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F',  16=>'G',  17=>'H',     
        18=>'I',19=>'J',  20=>'K', 21=>'L',  22=>'M',  23=>'N', 24=>'O', 25=>'P', 26=>'Q',     
    27=>'R',28=>'S',  29=>'T',  30=>'U', 31=>'V',  32=>'W',  33=>'X', 34=>'Y', 35=>'Z' 
    ); 
 
 
    public function encodeID($int, $format=8) { 
        $dics = $this->dic; 
        $dnum = 36; //进制数 
        $arr = array (); 
        $loop = true; 
        while ($loop) { 
            $arr[] = $dics[bcmod($int, $dnum)]; 
            $int = bcdiv($int, $dnum, 0); 
            if ($int == '0') { 
                $loop = false; 
            } 
        } 
        if (count($arr) < $format) 
            $arr = array_pad($arr, $format, $dics[0]); 
 
        return implode(&#39;&#39;, array_reverse($arr)); 
    } 
 
    public function decodeID($ids) { 
        $dics = $this->dic; 
        $dnum = 36; //进制数 
        //键值交换 
        $dedic = array_flip($dics); 
        //去零 
        $id = ltrim($ids, $dics[0]); 
        //反转 
        $id = strrev($id); 
        $v = 0; 
        for ($i = 0, $j = strlen($id); $i < $j; $i++) { 
            $v = bcadd(bcmul($dedic[$id { 
                $i } 
            ], bcpow($dnum, $i, 0), 0), $v, 0); 
        } 
        return $v; 
    } 
 
}

Code クラスを定義し、最初にパスワード辞書、つまり 0 ~ Z に対応する値を定義します。encodeID($int, $format) メソッドのパラメータ $int は数値を表し、$format は数値を表します。 encodeID(123456789, 5) は、数値 123456789 を 5 桁の 36 桁の数値に変換することを意味し、メソッド decodeID($ids) は、36 桁の数値を 10 進数に変換するために使用されます。 。

次のようにカード番号を生成できます:

$code = new Code(); 
$card_no = $code->encodeID(888888,5);

上記のように、実際にはカード番号 888888 (8 の 6) の会員番号を表す 5 桁のカード番号を取得できます。実際の変換は 5 です。 -桁番号:0J1VC。

次に、都市番号とチェックコードを追加します。都市番号はすでに定義されており、この例では、最初の 3 つの都市番号と 5 つの都市番号を加算するという単純なアルゴリズムを使用します。 -桁のカード番号は md5 暗号化され、md5 値の最初の 2 桁がチェック コードとして取得され、番号の後の 2 桁のチェック コードが取得されます。

$card_pre = &#39;755&#39;; 
$card_vc = substr(md5($card_pre.$card_no),0,2); 
$card_vc = strtoupper($card_vc); 
echo $card_pre.$card_no.$card_vc;

実際のアプリケーションでは、番号が一意であることを確認するためにデータベースから 10 進数を取得し、上記のコードを組み合わせて最終的に 10 桁の重複しない会員カード番号を生成します。

レンダリング:

(上級) PHP は固有の会員カード番号を生成します

上記は、固有の会員カード番号を生成する PHP の内容 (高度な部分) です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。