web-dev-qa-db-ja.com

一意のIDを生成する

アプリケーションの一意のIDを生成する必要があります。 (UUID.randomUUID()).toString()を使用すると、非常に長いコードが表示されます(これは一意になると思います)。

Javaタイムスタンプまたはランダム文字列を使用してコードを生成する場合、それがどれほど一意になるかはわかりません。

8-10文字の長さ(英数字)のみの一意のコードを生成する必要があります。どうやってそうするの? MySQLデータベースを使用しています。

データベース側で一意のコードを生成するのが最善の方法ですか、それともJavaでそのような短い(ただし一意の)コードを生成できますか?

サンプルコードを含む提案は非常に役立ちます。

18
user915303

これを実現するために、_commons-lang_のRandomStringUtils.randomAlphanumeric()メソッドを使用します。

_import org.Apache.commons.lang.RandomStringUtils;

public static final int ID_LENGTH = 10;

public String generateUniqueId() {
    return RandomStringUtils.randomAlphanumeric(ID_LENGTH);
}
_

Mavenを使用している場合は、プロジェクトの依存関係に_commons-lang_が追加されていることを確認してください。

_<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
_

データベース側で一意のコードを生成するのが最善の方法ですか、それともJavaでそのような短い(ただし一意の)コードを生成できますか?

それはあなたとあなたのプロジェクト次第です。 ID生成はビジネスロジックの一部ですか?はい、すべてのロジックがJavaで記述されている場合は、Javaで記述します。ロジックの全部または一部がデータベースに委任されている場合は、そこでIDを生成します(ただし、この場合、特定のデータベースに強く依存します)。

22
Slava Semushin

考慮する必要のある特定の制限はありますか?クロスアプリケーションの一意性など?それ以外の場合、MySQLはそれ自体でIDを生成できるため、必要なのは autoincrement 列を定義し、挿入時に指定しないことです(つまり、NULL value for it)-これにより、MySQLは次に使用可能なIDで埋められ、一意であり、ユーザーの作業は必要ありません。

英数字の文字列ではありませんが(要件または制限として指定したかどうかはわかりません)、必要なのが一意性だけであれば、それで十分です。ランダムに生成された文字列の一意性を保証するには、8〜10文字の英数字では不十分であるため、データベースで挿入チェックを実行する必要があります。

7
Naltharial

データベース側で一意のコードを生成するのが最善の方法ですか、それともJavaでそのような短い(ただし一意の)コードを生成できますか?

データベースは、必要に応じて一意のIDを生成できるように設計されています。あなた(または私)がコーディングできるものが、その「より良い」バリアントになるとは思えません。

5
Andrew Thompson

半一意の非シーケンシャル64ビット長の数値を生成できる簡単なサービスを作成しました。冗長性とスケーラビリティのために、複数のマシンに展開できます。メッセージングにZeroMQを使用します。仕組みの詳細については、githubページをご覧ください: zUID

1
Majid Azimi

見てください: IDGenerator.Java

あなたはそれをカスタマイズすることができます(処理のみ、または世界に固有)、それは使いやすく、高速です:

    private static final UIDGenerator SCA_GEN = new UIDGenerator(new ScalableSequence(0, 100));
.......
    SCA_GEN.next();

実装を変更してIDのサイズを縮小する(および他のトレードオフを追加する)ことができます

次の場所でベンチマーク結果を参照してください。

http://zoltran.com/roller/zoltran/entry/generate_a_unique_id

または自分で実行します。

0
user2179737

ID生成部分がデータベースで行われるかJava end:この質問は、アプリケーションの要件に応じて回答する必要があります:

1)1つの方法は、System.currenTimeMillis()を使用することです。ただし、アプリケーションがマルチクラスター環境で機能する場合は、値が重複する可能性があります。

http://www2.sys-con.com/itsg/virtualcd/Java/archives/0512/Westra/index.html

2)別の方法はUUIDジェネレーターを使用することです。マージする必要のある異なるデータベースがある場合に役立ちます。この方法を使用すると、データベースをマージするときにIDの重複について心配する必要はありません。

https://marketplace.informatica.com/solutions/mapping_uuid_using_Java

あなたが考慮したいと思うかもしれない他の要因があるかもしれません。あなたの質問によると、UUIDメソッドが実行されます。

0
Shweta Gulati