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

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

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

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

Q&A

解決済

5回答

3483閲覧

5~6桁のユニークなIDを生成する方法(PHP)

charlie7

総合スコア13

PHP

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

0グッド

1クリップ

投稿2017/09/12 01:47

編集2017/09/12 02:34

いつもお世話になっております。

モバイルアプリの開発に際して、アプリの会員IDとは別に、
データ引継ぎ用のコードを生成したいと考えております。
(端末を変えた場合等を想定。)
データは、サーバ側のDB(MySQL)で管理します。

そこで、特定のキーをもとにして、
5~6桁のユニークなIDを生成する方法をご教示いただければ幸いです。

IDは、英数字混在を想定していますが、英字の大文字/小文字は区別しない想定です。
(MySQLでは、大文字と小文字を区別しない設定にしているため)
キーは端末IDでなくてもよいのですが、ユニークなキーを使うものとして、仮に端末IDを考えています。

使用する言語は、PHPになります。

PHPでは、uniqid関数などがあることは調べたのですが、
完全にユニークというわけではないですし、桁数が多いので、
移行用のコードとして利用するには適さないと考えております。

また、コードは、ランダムである必要はないので、
キーをもとにして生成されるようにしたいと考えております。

追記1:
ユーザー数は、数万件を想定しています。
また、5,6桁としているのは、ユーザが機種変更等でデータの移行時に直接入力するからになります。
会員IDは、別に持っているのでそれを使うこともできるのですが、不正利用を防止するために別のコードを使いたいです。会員IDは、連番です。
また、数字だけの連番の場合には、推測されやすくなるので、英字も含めたいと考えていました。
会員ID+ランダムな文字列を移行コードにすることも考えています。

以上、よろしくお願いいたします。

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

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

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

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

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

masaya_ohashi

2017/09/12 02:09

要件の記述が足りなさすぎると思います。ブラウザでのアクセスの場合、端末固有のIDといったものを取得する術はありません。どういう用途で使われるIDでしょうか?英数混在で5、6桁でユニークとなると、かなり重複に気を使わないといけないと思いますが、そのへんは理解されておりますか?5、6桁である必要性はありますか?たとえ端末IDを取れたとしても、それを元に乱数で生成してユニークになる保証はありません。また、ブラウザアクセスである場合、ユーザにアカウント登録などをしてもらわない限り、簡単に偽装ができる状況になると思います。その上でもう少し詳しく状況を記述してください。求めるものがランダムな5、6桁の文字だったらなんでもよいのであればそのように書いてください。
m.ts10806

2017/09/12 02:20

想定されるユーザー数により適切な対応がありますので、その辺りの仕様も開示必要と思います。
charlie7

2017/09/12 06:07

ご回答ありがとうございました。参考にさせていただきます。
guest

回答5

0

移行用の 5-6 桁であれば、時限付きのワンタイム token が現実的な気がします。
そもそも移行用の固定 token を永続的に付与するのは危険です。

ただ、桁数が少ないので、長い期間を設定するとやはり総当りでアカウントが乗っ取られる可能性は否定できません。
別途総当り対策やその他いろいろ知見が必要になると思います。

投稿2017/09/12 02:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

charlie7

2017/09/12 05:57

ご回答ありがとうございました。ワンタイムtokenを使用することも検討したいと思います。
guest

0

5~6桁のユニークなID

とありますが、衝突する危険性を考えれば短すぎる可能性が大いにあります。

「誕生日のパラドックス」として知られるように、同じIDが発生する平均件数は、IDの総数の平方根に比例します。つまり、英数字6桁であれば、半分の3桁分、つまり数万件で衝突する危険性が現実的となります。

投稿2017/09/12 02:05

maisumakun

総合スコア145183

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

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

charlie7

2017/09/12 06:02

ご回答ありがとうございました。ユーザーが手動で入力することを想定していたので、なるべく少ない桁数にできないかと考えていました。参考にさせていただきます。
guest

0

ベストアンサー

一見ランダムに見えてユーザーから推測しにくい 6 桁の ID を数万件作ればいいのでしょうか?
まず英数字の組み合わせでできた ID を連番で 10 万件作ります(必要ならもっと)。
それをデータベースに収めます。この時、ID を作成するためのキーを格納するカラムを作成します。

キーから ID を作成するには、まずそのキーがデータベースに含まれているかどうかを検索し、含まれていれば対応する ID を返します。
含まれていなければキーが空白の最初のレコードを取り出し、キー欄を埋めてアップデートし、ID を返します。

投稿2017/09/12 07:12

Zuishin

総合スコア28660

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

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

charlie7

2017/09/12 07:35

ご回答ありがとうございました。最終的な実装は別になると思いますが、さまざまな意見を聞くことができ、考える上で参考になりました。一番目的に近い方法でしたので、ベストアンサーに選ばせていただきました。ありがとうございました。
guest

0

PHPでは、uniqid関数などがあることは調べたのですが、
完全にユニークというわけではないですし、桁数が多いので、
移行用のコードとして利用するには適さないと考えております。

5、6桁程度で完全なユニークを求めているならそもそもデータベースに発行済のIDを記録しておかない限り、どんな乱数生成アルゴリズムを利用しても衝突の危険性はかなり高いです。引き継ぎ時に使用するということですが、引き継ぎ前に発行、引き継ぎ後に無効化されるコードでしょうか?そうであれば5、6桁のランダムな英数字で十分ではあると思います。(もちろん発行時にデータベースに衝突がないかのチェックは必須ですが)
引き継ぎデータ生成時にランダムに生成したIDを付与する形ではだめなのでしょうか?ランダムでなく何かをキーにハッシュ値を作る理由がわかりません。
ランダムな文字列を作るだけであれば、以下のURLを参考にしてください。
http://qiita.com/suin/items/c958bcca90262467f2c0

投稿2017/09/12 02:32

masaya_ohashi

総合スコア9206

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

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

charlie7

2017/09/12 05:59

ご回答ありがとうございました。引継ぎ前後に無効化する使用や、キーなしの仕様も検討したいと思います。
guest

0

データ量にもよりますが、ユニークだけが目的ならDB側でauto_incrementを使えばよろしいのでは?

投稿2017/09/12 02:20

yambejp

総合スコア114777

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

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

charlie7

2017/09/12 06:01

ご回答ありがとうございました。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問