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

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

ただいまの
回答率

90.61%

  • PHP

    19820questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,286

charlie7

score 7

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

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

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • masaya_ohashi

    2017/09/12 11:09

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

    キャンセル

  • mts10806

    2017/09/12 11:20

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

    キャンセル

  • 退会済みユーザー

    2017/09/12 14:18

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • charlie7

    2017/09/12 15:07

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

    キャンセル

回答 5

+5

5~6桁のユニークなID

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 15:02

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

    キャンセル

+5

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 14:57

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

    キャンセル

checkベストアンサー

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 16:35

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

    キャンセル

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 14:59

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 15:01

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    mySQLの重複について

    重複するカラムを片方のレコード一件にまとめようと思っています 調べたら下記の文にを見つけました。 min_id,min(t1.id), t1 ,t1,t2この辺の値に何をいれてよい

  • 解決済

    電話による本人確認の実装について

    いつもお世話になっております。 とあるwebシステムの開発で、実装方法の方針がわからずに手が止まってしまい、質問させていただきます。 ■概要 webシステム(LAMP

  • 解決済

    可変の期間内で一意なユーザーのアクセス数を集計したい

    LAMP環境でのシステム開発を行っています。 とあるテーブルに「ユーザーID」と「アクセス時間」のデータを保持しており このテーブルから、一定の期間内における一意なユーザー

  • 受付中

    友達招待機能

    先ほど、友達管理機能についてご質問させていただきましたが、その続きでご質問させていただきます。 会員さんが、非会員の人を招待する機能を考えております。 想定しているフロ

  • 解決済

    insertした際のprimary keyの値を知りたい。

    度々お世話になっております。 CREATE TABLE users ( users_id int(8) NOT NULL AUTO_INCR

  • 解決済

    Freeeなどのクラウド提供の会計ソフトのデータベースについて

    お世話になります。表題の「Freeeなどのクラウド提供の会計ソフトのデータベースについて」ご意見をお聞かせください。 freeeなど、クラウドで提供されている会計ソフトがあり

  • 解決済

    mySQLで値をグループ化した後それらがもつ共通の値の数を数えたい。

    前提・実現したいこと SQL文でテーブルの フェードごとに取得しPHPで回し その中で更にselect文をかけ ページフィードごとに集計を 取得していたのですが、 レコード数が増え

  • 解決済

    データベースvsファイル データ管理について

    お世話になります。PHPとMySQLで、オリジナルの「いいねボタン」の実装を進めているのですが、ある方から以下のような指摘を頂戴し、皆様の意見を伺えればと、質問させて頂きました。

同じタグがついた質問を見る

  • PHP

    19820questions

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