ホームページ  >  記事  >  バックエンド開発  >  一意の番号 (36 桁の非繰り返し番号) を生成するための PHP 実装_PHP チュートリアル

一意の番号 (36 桁の非繰り返し番号) を生成するための PHP 実装_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:26:251162ブラウズ

5桁のナンバープレート番号、10桁のID番号、注文シリアル番号、短縮URLなど、桁数に制限がある膨大なデータに番号を付けたい場合、 16 進数の計算を使用して、桁数に一致する一意の数値を取得できます。

文字 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の実装

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

コードをコピーします コードは次のとおりです:

クラスコード {
//パスワード辞書
プライベート $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'
);

パブリック関数 encodeID($int, $format=8) {
$dics = $this->dic
$dnum = 36; // 基数
; $arr = 配列 (); $loop = true; while ($loop) {
$arr[] = $dics[bcmod($int, $dnum)]; $int = bcdiv($int, $dnum, 0); if ($int == '0') {
$loop = false;                                                                                }
If (count($arr) $arr = array_pad($arr, $format, $dics[0]);
return implode('', array_reverse($arr)); }

パブリック関数 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 $v = bcadd(bcmul($dedic[$id {
$i }
]、bcpow($dnum, $i, 0), 0), $v, 0); }

$v を返します。 }

}

Code クラスを定義し、最初にパスワード辞書、つまり 0 から Z に対応する値を定義します。encodeID($int, $format) メソッドのパラメータ $int は数値を表し、$format はその値を表します。 encodeID(123456789,5) などの桁の長さ 123456789 という数値を 5 桁の 36 桁の数値に変換することを意味し、メソッド decodeID($ids) を使用して 36 桁の数値を 10 進数に変換します。
次のようにカード番号を生成できます:

コードをコピーします コードは次のとおりです:

$code = 新しいコード(); $card_no = $code->encodeID(888888,5);

上記のように、実際にはカード番号 888888 (8 の 6 桁) の会員番号を表す 5 桁のカード番号を取得できます。実際の変換は 5 桁の番号 0J1VC です。 次に、都市番号とチェック コードを追加します。都市番号は定義されており、この例では、最初の 3 つの都市番号と 5 つのカードを加算するという単純なアルゴリズムを使用します。番号をmd5暗号化し、md5値の最初の2桁をチェックコードとして、番号に続く2桁のチェックコードを取得します。


コードをコピーします コードは次のとおりです:
$card_pre = '755'; $card_vc = substr(md5($card_pre.$card_no),0,2); $card_vc = strtoupper($card_vc); エコー $card_pre.$card_no.$card_vc



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

http://www.bkjia.com/PHPjc/824704.html

www.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/824704.html技術記事 5桁のナンバープレート番号、10桁の文書番号、注文シリアル番号、短縮URLなど、桁数に制限がある膨大なデータに番号を付けたい場合、使えます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。