1

メソッド generateCustumerId() を呼び出すたびに、一意の ID を生成したいと考えています。生成された ID は、8 文字または 8 文字未満である必要があります。この要件は、データ ファイルに格納する必要があり、スキーマがこの ID に対して 8 文字であると判断されるため必要です。

オプション 1 は正常に機能します。オプション 1 の代わりに、UUID を使用したいと考えています。問題は、UUID が多くの文字を持つ ID を生成することです。誰かが 99999999 未満の一意の ID を生成する方法を知っていますか?

オプション1

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class CustomerIdGenerator {

private static Set<String> customerIds = new HashSet<String>();
private static Random random = new Random();

// XXX: replace with java.util.UUID
public static String generateCustumerId() {

    String customerId = null;
    while (customerId == null || customerIds.contains(customerId)) {
        customerId = String.valueOf(random.nextInt(89999999) + 10000000);
    }
    customerIds.add(customerId);
    return customerId;
}

}

option2 は長すぎる一意の ID を生成します

 public static String generateCustumerId() {
    String ownerId = UUID.randomUUID().toString();
    System.out.println("ownerId " + ownerId);
    return ownerId
}
4

4 に答える 4

2

Commons Id プロジェクトが役に立つかもしれません 。英数字ジェネレーター(およびその他のジェネレーターも同様) は、長さの引数を取ります。もちろん、これは実際にはシーケンスをサポートしているだけです (これは、アプリケーションの再起動時に最後の最高の識別子を知る必要があることを意味します)。

あるいは、ローカルタイムの CRC-32 チェックサムやランダムに生成されたバイト配列などを試すこともできます (CRC32 はJava 標準ライブラリに組み込まれています)。

于 2010-03-28T17:24:58.023 に答える
1

一意である必要がありますか、それともランダムである必要がありますか?一意である必要があるだけの場合は、アプリケーションの起動時にデータストアから最大値を読み込むことができます(データファイルに書き込んでいるアプリは1つだけであると想定しています)。あなたがあなたの最高の価値を持っているもの:

public class IdGenerator{
  private String value;

  public IdGenerator( String initial value ){
    this.value = value;
  }

  public synchronized String nextValue(){
    value = incrementValue( value );
    return value;
  }

  private static String nextValue( String currentValue ){
    // Somehow increment the value.
    return incrementedValue;
  }

}

uuidで許可する文字に応じて、これはさまざまな方法で実行できます。現在の文字列の最後の文字を読み取り、それが最後に許可された文字であるかどうかを確認します。その場合は、7番目の文字をインクリメントします。それ以外の場合は、最後の文字をインクリメントします。

于 2010-03-29T03:13:52.630 に答える
1

新しい ID が要求されるたびに 1 ずつ増加する永続的なカウンターを保持します。

データ ファイルが SQL テーブルの場合は、いつでも MAX(id) + 1 を選択してそれを使用できますが、2 つの ID が同時に必要な場合にマルチタスクの問題が発生しないことを完全に確認する必要があります。どちらも MAX(id) から同じ値を持ちます)。ほとんどのデータベースには、この目的のために設計されたネイティブ データ型があり、重要なプログラムではその機能を使用する必要があることに注意してください。

于 2010-03-29T05:39:02.157 に答える
1

世界で最高の解決策ではありませんが、uuid を長さに切り刻むのはどうですか? グローバルに一意ではありません-グローバルに一意の識別子を取得できないことに注意してください-しかし、ローカルに一意の場合は機能する可能性があります.

于 2010-03-28T16:22:33.783 に答える