-
- /*
- com_create_guid() は、php5 バージョンでサポートされている関数です。サポートされていないバージョンの場合は、自分で定義できます
- */
- function guid(){
- if (function_exists('com_create_guid')){
- return com_create_guid();
- }else{
- mt_srand((double)microtime()*10000);//php 4.2.0 以降ではオプション
- $charid = strtoupper(md5(uniqid) ( rand(), true)));
- $hyphen = chr(45);// "-"
- $uuid = chr(123)// "{"
- .substr($charid, 0, 8).$ハイフン
- .substr($charid, 8, 4).$hyphen
- .substr($charid,12, 4).$hyphen
- .substr($charid,16, 4).$hyphen
- .substr($charid, 20 ,12)
- .chr(125);// "}"
- return $uuid
- }
- }
-
-
コードをコピー
2.MD5
guid と同様に、32 文字の 16 進数を出力します。違いは、guid がランダムに生成されるのに対し、md5 は入力データに基づいて生成される必要があることです。
例:
$str = "Hello"; -
- コードをコピーします。
出力:
8b1a9953c4611296a827abf8c47804d7
利点: 入力シード データに基づいて出力値を制御できます。シード データが規則的で反復しない場合、データは md5 によって保護できるため、大きな混乱効果が生じます。
欠点: 32 ビット文字は長すぎるため、一意のシード データを提供する必要があります。
使用法: 同時実行性が高く、シード データとして秒を使用しても、重複は発生します。
/* * time() 関数と組み合わせて使用され、1970 年から現在までの秒数をシード番号として使用します */ $str=time() ; echo md5($ str) - ?>
-
-
-
3. uniqid(): 13 桁または 23 桁の文字列を返します。
私たちの目的では、uniqid() は md5() の改良版のようなもので、特に差分識別子を文字列プレフィックスとして使用できるため、名前が重複する可能性を減らすことができます。
同時実行性が高くないなどの極端な状況の場合は、一般的なニーズをすでに満たしているこの関数を使用することをお勧めします。
詳細な説明:
定義: uniqid() 関数は、マイクロ秒単位の現在時刻に基づいて一意の ID を生成します。
使用法: uniqid(prefix,more_entropy);
注: prefix は出力文字列に接頭辞を追加できます。more_entropy パラメーターが true の場合、23 ビット文字列が出力されます。
-
-
-
-
-
var_dump(uniqid());
;
出力は次のとおりです。
文字列(13) "51734aa562254" 文字列(14) "a51734aa562257"
利点: 13 ビットの文字列長が許容可能なファイル名長です。プレフィックスを追加でき、結果にはデータの難読化が含まれるため、元のデータの逆参照を回避できます。
欠点: md5 と同様、同時実行性が高く、シード データとして秒を使用するため、やはり重複が発生します。
3.バージョンアップ計画
1. fast_uuid: 17 桁を返します。
uniqid() の不完全なカスタマイズ バージョンに似ていますが、この関数に表示される「シード番号の開始時刻」という概念は非常に啓発的です。
time() と uniqid() で使用されるデフォルトの時刻は 1970 年から計算され、その長さは 10 桁 (1366512439) です。実際に必要なのは 1 つだけであるため、「シード番号開始時刻」を使用するとこの値を減らすことができます。自動的に増加する可能性のある値。
開始時間をカスタマイズすると、長さが短縮されるだけでなく、混乱を招く可能性もあります。
/* - * パラメータ suffix_len は、生成された ID 値に追加されるランダムな桁数を指定します。デフォルト値は 3 です。
- * @param int suffix_len
- * @return string
- */
- function fast_uuid($ suffix_len=3) {
- //! シード番号の計算開始時刻
$being_timestamp = strtotime('2013-3-21') $time =explode(' ', microtime()); = ($time[1 ] - $being_timestamp) . sprintf('%06u', substr($time[0], 2, 6)); if ($suffix_len > 0) { $id .= substr (sprintf('%010u ', mt_rand()), 0, $suffix_len); $id を返す }
-
- コードをコピーします。
出力:
29832412631099013
2. time()+乱数
1 秒間に発生する複数のリクエストを解決するために、乱数の使用は上記の例ですでに登場しています。
次の 2 つの関数が提供されます。
functionrandom($length) {
- $hash = '';
- $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';文字) - 1;
- PHP_VERSION < 4.2.0' && mt_srand((double)microtime() * 1000000);
- for($i = 0; $i $hash .= $chars[mt_rand(0, $max) )];
- return $hash;
- }
- function randman2($length, $numeric = 0) {
- PHP_VERSION $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
- $seed = $numeric ? (str_replace('0', '', $シード).'012340567890') : ($seed.'zZ'.strtoupper($seed));
- $hash = '';
- $max = strlen($seed) - 1; $i < $length; $i++) {
- $hash .= $seed(0, $max) }
- $hash;
-
-
- ; ,最終提案
アイデア: ユーザー ID + 秒 + 乱数。このうち、「userid+秒」は10進数から64に変換され、桁数が減ります。
例証します:
1. userid: 16 進数の「ZZZZ」の最大値を 10 進数に変換すると「16777215」、「ZZZ」の 10 進数に変換した最大値は「262143」になります。
2. 秒: 独自の時間の開始点を設定します。
$less=time()-strtotime(’2012-4-21’) は 16 進数の「1SpRe」、5 桁に変換されます
$less=time()-strtotime(’2013-3-21’) は 16 進数の「_jHY」、4 桁に変換されます
3. 乱数:random(3) を使用して 3 桁の乱数を生成します。
最終結果: 4 桁のユーザー ID + 4 桁の秒 + 3 桁の乱数 = 11 桁の文字列。結果は uniqid() と似ていますが、堅牢性が向上しています。
- 1
- 2 次のページ 最後のページ
-
-
-
|