ホームページ >バックエンド開発 >PHPチュートリアル >PHP で一意の識別子を生成する方法
ファイル名の重複を避ける
32 文字の 16 進数。
形式: GUID の形式は「xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx」です。各 x は、0 ~ 9 または a ~ f の範囲の 32 桁の 16 進数です。たとえば、6F9619FF-8B86-D011-B42D-00C04FC964FF は有効な GUID 値です。
長所: 繰り返しがほとんどありません。
短所: アップロードした写真の名前を変更するにはまだ時間がかかります。
使用法:
<?php/* com_create_guid()是php5版本支持的功能,对于不支持的版本,可以自己进行定义; */function guid(){ if (function_exists(‘com_create_guid’)){ return com_create_guid(); }else{ mt_srand((double)microtime()*10000);// optional for php 4.2.0 and up. echo(mt_rand()); $charid = strtoupper(md5(uniqid(rand(), true))); $hyphen = chr(45);// “-” $uuid = chr(123)// “{” .substr($charid, 0, 8).$hyphen .substr($charid, 8, 4).$hyphen .substr($charid,12, 4).$hyphen .substr($charid,16, 4).$hyphen .substr($charid,20,12) .chr(125);// “}” return $uuid; } }?>
は、guid と同じ 32 文字の 16 進数を出力します。違いは、guid がランダムに生成され、md5 は入力データに基づいて生成される必要があることです。
< ?php$str = "Hello";echo md5($str);?>
出力:
8b1a9953c4611296a827abf8c47804d7
利点: 入力シード データに基づいて出力値を制御できます。シード データが規則的で反復しない場合、データは md5 を通じて保護できますが、これは大きな混乱を引き起こします。
欠点: 32 ビット文字は長すぎます。重複しないシード データを提供する必要があります。シード データとして秒を使用すると、依然として重複が発生します。
使用法:
< ?php/* *结合time()函数使用,以1970年到当前时间的秒数作为种子数。 */$str=time();echo md5($str);?>
13 桁または 23 桁の文字列を返します。
特に、名前が重複する可能性を減らすために文字列プレフィックスとして差分識別子を使用できるため、uniqid() は md5() の改良版のようなものです。
同時実行性が高くないなどの極端な状況では、すでに一般的なニーズを満たすことができるこの関数を使用することをお勧めします。
定義: uniqid() 関数は、マイクロ秒単位の現在時刻に基づいて一意の ID を生成します。
使用法: uniqid(prefix,more_entropy)
説明: prefix は出力文字列にプレフィックスを追加できます。 more_entropy パラメーターが true の場合、23 ビットの文字列が出力されます。
< ?phpvar_dump(uniqid());var_dump(uniqid("a")); ?>
出力結果は次のとおりです:
string(13) “51734aa562254″ string(14) “a51734aa562257″
利点: 13 桁の文字列の長さは、ファイル名に許容される長さです。プレフィックスを追加でき、結果にはデータの混乱が含まれるため、元のデータの逆参照を回避できます。
短所: md5 と同様、同時実行性が高く、シード データとして秒を使用するため、やはり重複が発生します。
この関数に登場する「シード番号開始時刻」の概念は、uniqid() の不完全なカスタマイズ版に似ています。
time() と uniqid() で使用されるデフォルトの時刻は 1970 年から計算され、長さは 10 桁 (1366512439) です。「シード番号開始時刻」を使用すると、実際には必要なため、この値を減らすことができます。これは単なる値です。自動的に成長する可能性があります。
開始時間をカスタマイズすると、長さが短縮されるだけでなく、混乱を招く可能性もあります。
/* * 参数 suffix_len指定 生成的 ID 值附加多少位随机数,默认值为 3。 * 感谢“Ivan Tan|谭俊青 DrinChing (at) Gmail.com”提供的算法。 * @param int suffix_len * @return string*/function fast_uuid($suffix_len=3){ //! 计算种子数的开始时间 $being_timestamp = strtotime(’2013-3-21′); $time = explode(‘ ‘, microtime()); $id = ($time[1] – $being_timestamp) . sprintf(‘%06u’, substr($time[0], 2, 6)); if ($suffix_len > 0) { $id .= substr(sprintf(‘%010u’, mt_rand()), 0, $suffix_len); } return $id; }
出力:
29832412631099013
乱数の使用は、1 秒間に発生する複数のリクエストを解決するために上記の例ですでに登場しています。
< ?phpfunction random($length) { $hash = ''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; $max = strlen($chars) - 1; PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000); for($i = 0; $i < $length; $i++) { $hash .= $chars[mt_rand(0, $max)]; } return $hash; }function random2($length, $numeric = 0) { PHP_VERSION < '4.2.0' ? mt_srand((double)microtime() * 1000000) : mt_srand(); $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35); $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed)); $hash = ''; $max = strlen($seed) - 1; for($i = 0; $i < $length; $i++) { $hash .= $seed[mt_rand(0, $max)]; } return $hash; }?>
アイデア: ユーザー ID+秒+乱数。このうち、「userid+秒」は 10 進数から 64 に変換され、桁数が減ります。
userid: 最大値 64 の「ZZZZ」は 10 進数に変換され、「16777215」となります。 、「ZZZ」は「262143」に変換されます。
$less=time()-strtotime(’2012-4-21′); 转换为64进制”1SpRe“,5位$less=time()-strtotime(’2013-3-21′); 转换为64进制”_jHY“;4位
V. 概要
具体的な使い方は、状況に応じて柔軟に使用できます。
関連する推奨事項:
一意の識別子を生成するために PHP を正しく実装する方法
以上がPHP で一意の識別子を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。