ホームページ >バックエンド開発 >PHPチュートリアル >PHP で一意の識別子を生成する方法

PHP で一意の識別子を生成する方法

小云云
小云云オリジナル
2018-03-22 14:29:402471ブラウズ


識別子(IDentifier)とは、エンティティを識別するために使用される記号を指します。異なるアプリケーション環境では異なる意味を持ちます。この記事では主に PHP で一意の識別子を生成する方法について説明します。お役に立てれば幸いです。

1. 適用可能なシナリオ

ファイル名の重複を避ける

2. 従来のソリューション

2.1 guid

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;
 }
}?>

2.2 MD5

は、guid と同じ 32 文字の 16 進数を出力します。違いは、guid がランダムに生成され、md5 は入力データに基づいて生成される必要があることです。

< ?php$str = "Hello";echo md5($str);?>

出力:

8b1a9953c4611296a827abf8c47804d7

利点: 入力シード データに基づいて出力値を制御できます。シード データが規則的で反復しない場合、データは md5 を通じて保護できますが、これは大きな混乱を引き起こします。

欠点: 32 ビット文字は長すぎます。重複しないシード データを提供する必要があります。シード データとして秒を使用すると、依然として重複が発生します。

使用法:

< ?php/*
*结合time()函数使用,以1970年到当前时间的秒数作为种子数。
*/$str=time();echo md5($str);?>

2.3 uniqid()

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 と同様、同時実行性が高く、シード データとして秒を使用するため、やはり重複が発生します。

3. アップグレードされたソリューション

3.1 fast_uuid: 17 桁の数値を返します

この関数に登場する「シード番号開始時刻」の概念は、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

3.2 time()+乱数

乱数の使用は、1 秒間に発生する複数のリクエストを解決するために上記の例ですでに登場しています。

< ?phpfunction random($length) {
 $hash = &#39;&#39;; $chars = &#39;ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz&#39;; $max = strlen($chars) - 1;
 PHP_VERSION < &#39;4.2.0&#39; && 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 < &#39;4.2.0&#39; ? mt_srand((double)microtime() * 1000000) : mt_srand(); $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35); $seed = $numeric ? (str_replace(&#39;0&#39;, &#39;&#39;, $seed).&#39;012340567890&#39;) : ($seed.&#39;zZ&#39;.strtoupper($seed)); $hash = &#39;&#39;; $max = strlen($seed) - 1; for($i = 0; $i < $length; $i++) { $hash .= $seed[mt_rand(0, $max)];
 } return $hash;
}?>

IV の 2 つの関数が提供されます。最終的な解決策

アイデア: ユーザー ID+秒+乱数。このうち、「userid+秒」は 10 進数から 64 に変換され、桁数が減ります。

userid: 最大値 64 の「ZZZZ」は 10 進数に変換され、「16777215」となります。 、「ZZZ」は「262143」に変換されます。
  1. 秒: 独自の時間の開始点を設定します。
  2. $less=time()-strtotime(’2012-4-21′); 转换为64进制”1SpRe“,5位$less=time()-strtotime(’2013-3-21′); 转换为64进制”_jHY“;4位

乱数:random(3)を使用して3桁の乱数を生成します
  1. 最終結果:
  2. 4桁のユーザーID + 4桁の2番目 + 3桁の乱数 = 11-数字列。結果は uniqid() と似ていますが、堅牢性が向上しています。

V. 概要

この記事では、アップロードされた画像の名前を変更するために使用できるいくつかの方法について説明します。重要な点は、文字列を減らすために 10 進数を 16 進数に変更することです。

例えば、fast_uuid で生成された 17 桁の数値は、たった 7 文字の 16 進数に変換されます。

具体的な使い方は、状況に応じて柔軟に使用できます。

関連する推奨事項:

一意の識別子を生成するために PHP を正しく実装する方法

PHP 変数識別子のいくつかのルール

PHP で一意の識別子を生成する方法

以上がPHP で一意の識別子を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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