
随時増加するあるデータに対して、一意なIDを割り当ててゆきます。
通常は、1, 2, 3, … と連番を割り当てて行けば一意なIDになると思います。
その上で、IDでソートした時に発行順に並ぶのではなく、順番がランダムになるようにしたいのです。
(アルゴリズムを知らない人から、発行順を推測されないようにしたい。)
そこで考えたのが、"1", "2", "3", …という文字列に対するハッシュ(SHA1やMD5)ですが、sha1("1"), sha1("2"), sha1("3"), …とIDを発行していった場合、IDが重複してしまう可能性を心配しています。(とても低い確率ではあることは分かっていますが、皆無ではありません。)
ハッシュ関数を利用する他に、「一意」で「ランダム」で「衝突の可能性がゼロ」である文字列の生成方法はありませんでしょうか?(可能性がゼロというのは物理的に不可能だと思うので、例えばSHA-1であれば、160bitのハッシュが生成されますが、2^160個のIDを発行しても重複しない、ということを考えます。)
一応、規模は1000万ID程度を考えていますが、もっと大きなオーダーでも衝突しないに越したことはありません。
No.1ベストアンサー
- 回答日時:
0)DBに1000万個のIDを準備する(適当な連番でOK)
1)DBの件数を問い合わせる
2)件数からその範囲の乱数を求める
3)求まった番目のデータを取り出しIDとして発行する。
4)発行したIDのデータを削除する
5)手順1に戻る
ご回答ありがとうございます。
御礼が遅くなりまして、失礼致しました。
確かにこの方法で実現可能ですね。ひとまずOKだとは思うのですが、
もう少しスマートな方法があれば、と思い質問いたしました。
万一1000万を超えてしまった時の処理も大変そうです。
No.3
- 回答日時:
> 「一意」で「ランダム」で「衝突の可能性がゼロ」である文字列の生成方法はありませんでしょうか?
1.ランダムな文字列を作る
2.if (そのIDは発行済み) then 1に戻る
で、何か問題でも?
ご回答ありがとうございます。
この方法は、IDを発行するにつれて処理が重くなってしまうという欠点があると思います。
重複の可能性が高くなるとともに、重複しているかどうかチェックする対象も増えるわけなので。
この方法でも実現可能ですが、もっとスマートな方法があれば、と思い質問させて頂きました。
No.2
- 回答日時:
一意の連番をハッシュ の後に タイムナンバー(PCが規定の日時からどれくらい経過してるかを表してる方の。
ミリ秒以上の精度で取れるのが望ましい)を桁揃えして付加。後ろに付ける、というのがミソ(ソートだから前に付けると発行順になってしまう)
あるいは似た考えで一意の番号とタイムナンバーをそれぞれハッシュにかけてくっつける
一連の番号を管理するのが面倒なら タイムナンバーだけ使って前者の細工をしても良さそう
ご回答ありがとうございます。
御礼が遅くなりまして、失礼致しました。
この方法でも実現可能ですね。ただ、タイムナンバーを生で末尾につけてしまうと、
確かにソートに対してはランダムになりますが、発行順を推測することが容易です。
また、hash(連番) + hash(タイムナンバー) であっても、(さらに確率は低くなりますが)
重複の可能性が0ではありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) 知恵袋で重複投稿と新規ID取得と利用停止を繰り返していたらログイン方法の再設定が可能なYahoo! 5 2023/04/02 00:35
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- その他(データベース) accessについて 2 2022/05/31 16:58
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- Yahoo!メール Yahooアカウントにログインできないです。 1 2023/05/26 09:01
- その他(セキュリティ) Yahoo! JAPANのID取得について 1 2022/11/30 23:00
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- その他(セキュリティ) システムのセキュリティに詳しい方〜 飛行機のチケット使わなかったときのチケット費用補償保険/旅行キャ 1 2022/04/06 09:49
- その他(コンピューター・テクノロジー) VBA初心者です。 仕事の残業を少しでも減らしたく 最近勉強を始めたのですが フィルターを一気にかけ 4 2022/08/15 20:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
ハッシュのキーを変数で
-
ハッシュ値によるファイルの同...
-
素数表について。
-
流れ図(フローチャート)が分か...
-
画面を強制的に再描画させる方法
-
乱数の桁数指定、または範囲指定。
-
VBのReturnの使い方
-
perlで配列のポインタをdllに渡...
-
二次元配列のインデックスについて
-
Escキーを押すと、中断する時と...
-
CSVファイルの特定の行だけを読...
-
多重ループの抜けだし方
-
マクロ Publicでの配列定義
-
配列要素へのリファレンスと、...
-
テキストファイルの行数を指定...
-
DBIを使ってSelect文 複数のカ...
-
「偶数・奇数の和」のフローチ...
-
フローチャートを教えてください
-
VB2010でCSVファイルの読み込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
ハッシュ値によるファイルの同...
-
ハッシュ値が一致したデータは...
-
Perlは戻り値で、ハッシュや配...
-
まったく同じファイルのハッシ...
-
ハッシュとツリー構造
-
短いハッシュの作り方
-
*(アスタリスク)の意味
-
アンカークリックで2ヶ所のリ...
-
一意(ユニーク)かつ、ソート...
-
Perl初心者ですが
-
英語でのシャープとコメの呼び...
-
VBAにハッシュ関数はないのです...
-
Perlのサブルーチンの引数に配...
-
rubyであるサイトのデータを自...
-
サブルーチンの引数としてハッ...
-
ハッシュにおける値の取り出し
おすすめ情報