13

概要:永続的な Java Web アプリケーションを開発しています。重複を防ぐために、永続化するすべてのリソースにグローバルに一意の識別子があることを確認する必要があります。

ファインプリント:

  1. 私は RDBMS を使用していないので、派手なシーケンス ジェネレータ (Oracle が提供するものなど) を持っていません。
  2. 高速で、できればすべてメモリ内にあることを望みます-ファイルを開いて値をインクリメントする必要はありません
  3. スレッドセーフである必要があります (一度に 1 つの JVM だけが ID を生成する必要があると予想しています)。
  4. JVM のインスタンス化全体で一貫性が必要です。サーバーがシャットダウンして起動した場合、ID ジェネレーターは以前のインスタンス化で生成したものと同じ ID を再生成するべきではありません (または、少なくとも可能性は非常に低くなければなりません - 何百万もの既存のリソースが予想されます)。
  5. EJB 固有 ID パターンの記事で例を見てきました。それらは私にはうまくいきません (ミリ秒ごとに複数のリソースを永続化するため、System.currentTimeMillis() だけに依存したくありません)。
  6. この質問で提案されている回答を見てきました。それらについての私の懸念は、時間の経過とともに重複した ID を取得する可能性はどのくらいかということです。UUIDにjava.util.UUIDを使用するという提案に興味をそそられましたが、繰り返しになりますが、重複の可能性は限りなく小さくする必要があります。
  7. 私はJDK6を使用しています
4

6 に答える 6

32

UUIDが「十分」であることを確認してください。340,282,366,920,938,463,463,374,607,431,770,000,000 の UUID が利用可能です。

http://www.wilybeagle.com/guid_store/guid_explain.htm

「これらの数字を大局的に見ると、隕石に衝突する年間リスクは 170 億分の 1 の確率であると推定されます。つまり、その確率は約 0.00000000006 (6 × 10−11) であり、少数の隕石を作成する確率に相当します。 1 年間に数十兆の UUID が作成され、1 つの複製が作成されます. つまり、次の 100 年間、毎秒 10 億の UUID が生成された後でのみ、複製が 1 つだけ作成される確率は約 50% になります. 1 つの複製が作成される確率は、地球上のすべての人が 6 億の UUID を所有している場合、約 50% になります。」

http://en.wikipedia.org/wiki/Universally_Unique_Identifier

于 2008-10-10T20:32:29.807 に答える
1

PCごとに一意である必要がある場合:おそらく(System.currentTimeMillis() << 4) | (staticCounter++ & 15)またはそのようなものを使用できます。

これにより、1 ミリ秒あたり 16 を生成できます。さらに必要な場合は、5 シフトして 31...

複数の PC で一意にする必要がある場合は、プライマリ ネットワーク カードの MAC アドレスも組み合わせる必要があります。

編集:明確にする

private static int staticCounter=0;
private final int nBits=4;
public long getUnique() {
    return (currentTimeMillis() << nBits) | (staticCounter++ & 2^nBits-1);
}

nBits を、ミリ秒ごとに生成する必要がある最大数の平方根に変更します。

いよいよ転びます。nBitsが4の場合、おそらく20年か何か。

于 2008-10-10T20:37:21.637 に答える
1
public class UniqueID {
    private static long startTime = System.currentTimeMillis();
    private static long id;

    public static synchronized String getUniqueID() {
        return "id." + startTime + "." + id++;
    }
}
于 2008-10-13T08:25:04.920 に答える
0

メモリから、RMIリモートパッケージにはUUIDジェネレータが含まれています。それを調べる価値があるかどうかはわかりません。

それらを生成する必要がある場合、通常、現在の日時、ユーザー名、およびコンピューターのIPアドレスのMD5ハッシュサムを使用します。基本的には、コンピューター/人について知ることができるすべてのものを取得し、この情報のMD5ハッシュを生成するという考え方です。

それは本当にうまく機能し、信じられないほど高速です(初めてMessageDigestを初期化した後)。

于 2008-10-13T02:24:50.687 に答える
0

Java UUID の短くて高速な実装を使用する場合は、以下を参照してください。

https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/main/java/org/spf4j/concurrent/UIDGenerator.java

javadoc で実装の選択と制限を参照してください。

使用方法の単体テストは次のとおりです。

https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/test/java/org/spf4j/concurrent/UIDGeneratorTest.java

于 2014-09-30T03:57:40.750 に答える
0

なぜこのようにしないのですか

String id = Long.toString(System.currentTimeMillis()) + 
    (new Random()).nextInt(1000) + 
    (new Random()).nextInt(1000);
于 2012-03-16T21:49:47.087 に答える