質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

907閲覧

【PHP】uniqid関数について

t33

総合スコア33

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/07/20 06:47

編集2017/07/20 06:48

ユニークな値を作りたくuniqid関数を利用しようかと考えているのですが、
いまいちよく分からないことがありご質問しました。
何卒よろしくお願い致します。

【質問】
「uniqid関数」は、マイクロ秒単位の現在時刻にもとづいて文字列を生成するとのことですが、マイクロ秒単位の現在時刻とは(限りなく薄いとは思いますが)現在時刻が同じ場合同じ値になってしまうのでしょうか。

例えば
今日の12:00:00:00に生成した値と
明日の12:00:00:00に生成した値は同じになるということで合ってますでしょうか。

上記の場合、
線形合同法を使用して文字列を生成した場合ユニークといえるものなのでしょうか。

参考にしたURLを記載します。
http://ysklog.net/php/2103.html

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

マイクロ秒を利用するという表現はたいてい、日時+マイクロ秒という意味になります。
サーバー時間を戻さない限りその瞬間は二度と発生しませんので
理論的にはユニークになる可能性はたかくなります

ただしマイクロ秒から生成される文字列が他のマイクロ秒から生成されるものと
必ずしも違うとはかぎりませんので、気にされるかたのために
エントロピーを利用してよりユニークになりやすく機能が提供されているようです。

投稿2017/07/20 06:55

yambejp

総合スコア114581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2017/07/20 07:05

ご返信ありがとうございます! 万全を期すためエントロピーを使用したいと思います。 可能なら皆さんベストアンサーにしたいのですが、出来ないみたいですので 投稿時間が早かったyambejpさんをベストアンサーにさせてください。。 本当にありがとうございました!
退会済みユーザー

退会済みユーザー

2017/07/20 07:14

> ただしマイクロ秒から生成される文字列が他のマイクロ秒から生成されるものと必ずしも違うとはかぎりません 横からすみません。これって、何処かに記述がありますか?
guest

0

microtime()を使うと現在時刻のマイクロ秒でのタイムスタンプを取得することができますが、今日と明日の同じ時間でmicrotime()を実行すると、今日よりも明日の方が60 * 60 * 24 * 1000大きい値になります。
つまり、ごく短い時間の間に連続して実行しない限り、同じ値にはならないはずです。
現在時刻には年月日も含まれるということですね。

投稿2017/07/20 06:56

USI

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2017/07/20 07:00

ご返信ありがとうございます! 気になっていた点が解消出来ました、ありがとうございます!
guest

0

がると申します。
すでに締め切られてはいるようなのですが、少し気になりましたので。

「どんな意図で」ユニークな値が欲しいのか、にもよるのですが。
基本的には、uniqid()関数は「あまりお勧めできない」ように思われます(第二引数にtrueを指定しても23文字、かつ基本的にhex(と.以降はおそらく10進数なので、7byte+4byte弱)なので、空間が狭すぎるので)。

単純に「ユニークでよい」だけでよいのであれば。
使っている環境とPHPのバージョンにもよりますが、元ネタの値としてはrandom_bytes() または openssl_random_pseudo_bytes()で取得した値を、ある程度の長さのhash関数(よくsha1あたりが使われる事が多いですが、個人的にはsha-512あたりをよく使います)でhashすると、ある程度「ぶつかりにくい」値が出来る、かと思います。
(sha1で20byte、sha512で64byte)。

もうちょっとしっかりと「ぶつかりにくい」ものが欲しいのであれば、一つには「uuid」(の、バージョン4)あたりがぶつかりにくいもの、になりますので。
unix系環境であれば、おそらく

$id = rtrim(`uuidgen -r`);

で作成可能だと思いますので(或いは、いくつかライブラリもフリーであったかと思います)、そのあたりを使うとよろしいか、と思われます。

以上、何かの参考にでもなれば幸いです。

投稿2017/07/20 15:41

gallu

総合スコア506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

uniqid
こちらの関数は、マニュアルにもあるように
今日の12:00:00:00に生成した値と
明日の12:00:00:00に生成した値は別になりますが、

今日の12:00:00:00に生成した値と
今日の12:00:00:00に生成した値は同じになります。

つまり、複数ホストで同時に ID を生成するような場合は、同じマイクロ秒で同じ ID が生成されてしまう可能性があります。その為、「prefix」や「more_entropy」をつけて、より一意になる可能性を高めます。

散乱してますが、この辺の議論は目を通しておくと面白いです。
How unique is uniqid?

あと、参考資料ですが、グローバルでユニークな ID に関しては、RFC4122 の考え方が分かりやすいです。
rfc4122

投稿2017/07/20 07:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2017/07/20 07:36 編集

ご返信ありがとうございます! 今まであまり深く考えていなかったのですが、掘り下げるとかなり深い内容なんですね・・・。 これを機会に時間を取ってじっくり見てみたいと思います。 本当にありがとうございます!
guest

0

uniqid関数に何も引数を与えなければ、ユニークに近い値になります。
参考サイトに書いてあるように、第2引数にtrueを追加すれば、
線形合同法で作成された文字が追加されるということなので、よりユニークな値になるのではないでしょうか。

投稿2017/07/20 07:00

Iya712

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t33

2017/07/20 07:06

ご返信ありがとうございます! 第2引数にtrueを指定して実装したいと思います。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問