質問

チェックす

    List<String> list = new ArrayList<String>();
    for (int i = 0; i < 10000; i++) {
        String value = (""+UUID.randomUUID().getLeastSignificantBits()).substring(3, 20);
        assertFalse(list.contains(value));
        assertTrue(value.length() < 18);
        list.add(value);
    }

この方法のように過ぎ去っていきます。いわさきでん-さどおにけんばいのう少し良いものを少なくとも重要なビットではなく、最も大きい。が最も重要なビットのご6ビット固定のため一部の情報が、少なくとも重要な、そんなことはないんです。そのため、平均して作成する必要があり2^29Uuid取得との衝突に最も重要なビットが2^32多くとる必要があります。Ref: そのスレッド. 私にと仮定しょうか。

現在、私はチョッピング2の最大桁数を少なくとも重要なビットからの研究"に関するお問合せを使用している部分文字列。通知私はチョッピング2桁符号ビットがoffの時。 なものとなることを平均して作成する必要があり2^31Uuidに衝突?

正確に行うことにより生成する独自の識別名を超えることはできませんで17桁の長さです。これが整数にない感Javaタイプです。 どのように信頼が私のアプローチを考えていますか。

メタ情報:

実際に統一システムは、しなければなユニークな番号以17桁を表します。彼られるようになっていてデータベースのユニークキーます。また使用順この場合には、提案する。もっとサッカーができたので良かったで乱数ではなく、消費者のできないようですね。

かつタイプ-4実施のUUID Javaしを生成しなければならない2^61Uuidの平均に衝突.はなのいる、ということを意味していを生成しなければならない2^32の衝突に少なくとも重要なビットは、2^29の衝突に最も重要なビット?そしてその不正することができるものとして作成する必要があり平均2^31日の衝突に少なくとも重要なビットの後、チョッピングの2の左端の桁?

私は利用しようとした SecureRandom もとも与えてくれた19桁の長さの値です。そのため私はチョッピング初の桁のことです。以下のコードです。

    List<String> list = new ArrayList();
    Random random = new SecureRandom();
    for (int i = 0; i < 10000; i++) {
        String value = ""+random.nextLong().substring(2, 19);
        assertFalse(list.contains(value));
        assertTrue(value.length() < 18);
        list.add(value);
    }

その他のオプションで思いのは、日付フォーマット"yyMMddHHmmssSSS+2-配列番号桁の".そのようなプロセッサ依存性、guessableだと思います。となっていますので非常にあったいくつかの変化をミリ秒99後に集合しなければならない。きますが、このようにプロセッサ速度です。99を同時に要求してもくものです。

役に立ちましたか?

解決

であることをご使用になることからランダムまたはSecureRandomをランダムビットがoffにしてます。すべきます。

んが、お客様のポイントにチョッピングできるようにしました。したと仮定すると、あなたは生成17(小数)桁の数字から十分なビットからの長いサイクルPRNGすべてのチャンス1 10**17衝突のためのずれが発生するペアの数が多い。場合、ソースが良く、使用に十分なビットはその重要性が乏しい"チョッピング"...

なってくるということになる1 10**17 ありませんね---。でどのように多くの番号は存在する(お持続ストアを切り替えすることができるものとします。のためのインスタンスの場合で44万数現存し、もとの衝突で、少なくとも一つのペアは約1%.

く差し込む一部の番号へ 誕生日パラドックス計算.

編集:と思うのに必要なものは発電機を与えてくれる64ビットの擬似乱数の長いサイクルの長さ、絶対保証のない繰り返り数によりまかれる。なければなりません。きが続く状況の発生を再開します。そして、17小数桁の"ランダム"数値"は、次の値から発生装置、試験までの範囲 0 ... 10**17 - 1.れた場合は、使用しない場合には繰り返す。

管理する場合の発電機が正しくなく繰り返しの寿命をシステムがありゼロリスクの衝突.が重要であることを使PRNGはtrue RNG)まで送迎PRNGの右ます。

うえしましたが、ランダムクラスには、PRNG、サイクルの長さ 2**48;すなわちを取得する必要 2**48 番号(例:を使用 getLong() 法)の開始を繰り返す。大藤、SecureRandomのいずれかを真にランダムまたは擬似乱が非常に長いサイクルカウント...が小さいながらもゼロ以外のチャンスを繰り返し多くれます。

他のヒント

OK、複数の質問で頑張っております

  1. ば他のビットがない、上位ビットだuique付けられたidをもとに行います。同じように反対する。そのために必要な2^61番号を取得し、談合に関する
  2. の確率で.5、チョッピング3桁から+署名が書かれています。そのため、計2^41可番号のサンプルサイズのための共謀は2^21.(10^18 =~ 2^41)
  3. どんな姿を見せてくれるだろうかい結果:かせとなります。getLong()が呼び出され、その後を取り外すのビット乱数ビットの PRNG 作成され、作成されいしていませんのでご注意くださを確呼びかせとなります。getLong()またはgetInt().

が必要な場合は、17桁の数字なの

String id = String.valueOf(random.nextLong) % 1000000000000000000L);

通知するようにしてい対称分布からMAX_LONGは9223372036854775807Lの番号の範囲[0,23372036854775807"のような機会が表示されます。

また、よりさせていただきますので方法及びこなの確保独自のidです。

UUIDのアルゴリズムが実装固有のものです。

チョッピングのガイドより小さい番号が同じ一意性は保証です。のビットだけ保存そのものを重要なのでしょうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top