ホームページ  >  記事  >  バックエンド開発  >  PHPで一意のカード番号を生成する方法

PHPで一意のカード番号を生成する方法

WBOY
WBOYオリジナル
2016-06-13 13:40:38854ブラウズ

php で一意のカード番号を生成する方法
これはテレホンカードのようなもので、すべて数字であり文字はありません。

最初に思いついたのは、

N 桁の乱数 + データベース内のテーブルの自動インクリメント ID + N 桁の乱数

データベースは使いたくないので、時間という独自の基準を考えました。いくつかの乱数を使用してタイムスタンプを追跡します。

カード番号 16 が次のように生成されるとします。
タイムスタンプ 10 桁 + 6 桁の乱数 1316651745695261


ループ内で複数のカード番号を生成する必要がある場合があります。 、および前回のループ スタンプ (ループ内に他の時間のかかる操作がない限り、基本的に同じ) の場合、次の 6 桁の乱数が一意であることは保証できません。 microtime

を組み合わせて microtime を 10 回ループして呼び出すことを考えます:

0.80717200 1316675664
0.80720600 1316675664
0.80721300 1316675664
0.8 072 1900 1316675664
0.80722400 1316675664
0.80723000 1316675664
0.80723600 1316675664
0.80724100 1316675664
0.80724600 1316675664
0.80725200 6675664
807172だと思います 数字は見分けやすいです。コード:

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
for($i=0;$i<10;$i++){
         
         //echo $this->microtime_float();
         echo $time = microtime();
         $arr = explode(" ",$time);
         $micro = $arr[0]*100000000;
         $micro_str = substr($micro."",0,6);
         $timestamp = $arr[1];
         echo "\t".$timestamp."".$micro_str;
         echo '<br>';
     }



当面は、テストはローカル Windows で行われ、重複はありません。強力なコンピューティングを備えた、より強力なサーバーは存在しますか。電力とマイクロ秒を繰り返しますか?

また、この方法で生成されたカード番号は一目ではわかりにくいです。私たちは、その独自性を失うことを恐れて、それらのうちのいくつかを自由に傍受することはできません。良い方法があるかどうかは分かりません。
例えば、モバイル リチャージ カード生成メカニズム?桁が少ないものは多すぎてめまいがしてしまいます。 。 。

-----解決策---------
マイクロ秒数が繰り返される可能性はほとんどありません。また、不明な場合は、usleep(1) を増やして待つこともできます。

しかし、サーバーが時刻を変更した場合、マイクロ秒が繰り返されないという保証はできません。
------解決策------------------
タイムスタンプ (繰り返し可能) + 乱数 (繰り返し可能) のみを使用する場合、100% 競合がないという保証はありません...
提案: タイムスタンプ (繰り返し可能) + 乱数 (繰り返し可能) ) + データベースID またはその他の一意の値 (一意) を使用して一意の結果を取得します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。