ホームページ  >  記事  >  バックエンド開発  >  php は一意の会員番号を生成します

php は一意の会員番号を生成します

王林
王林オリジナル
2019-09-20 11:54:213057ブラウズ

php は一意の会員番号を生成します

データベースにクエリを実行せずに、ログインした各メンバーは、数字と文字の一意の組み合わせでメンバーシップ カード番号を生成します。

#レンダリングは次のようになります。

php は一意の会員番号を生成します

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

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

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

PHP

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 (6) を表す 5 桁のカード番号を取得できます。 8s) 会員番号ですが、実際に変換すると 0J1VC という 5 桁の番号になります。

次に、都市番号とチェック コードを追加します。都市番号は定義されており、チェック コードは特定のアルゴリズムを通じて取得されます。この例では、単純なアルゴリズムを使用します。最初の 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 サイトの他の関連記事を参照してください。

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