8文字未満のユニークな数字を生成する方法長さ
-
22-09-2019 - |
質問
methode 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
}
解決
ユニークであるかランダムである必要がありますか?一意である必要がある場合は、アプリケーションの起動時にデータストアから最高の値をロードできます(データファイルに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;
}
}
あなたがあなたに許可するキャラクターに応じて、これはさまざまな方法で行うことができます。現在の文字列の最後の文字を読み、それが最後の許可された文字であるかどうかを確認します。そのため、7番目のキャラクターなどを増やします。そうでなければ、最後の文字を増やします。
他のヒント
多分 Commons IDプロジェクト いくつかの使用です。 英数字発電機 (および他のジェネレーターも同様に)長さの引数を取ります。もちろん、それは実際にシーケンスをサポートしています(これは、アプリケーションの再起動の最終的な識別子を知る /決定する必要があることを意味します)。
または、LocalTimeのCRC-32チェックサムやランダムに生成されたバイト配列のようなものを試すこともできます(CRC32は Java Standard Libraryに組み込まれています).
世界で最良の解決策ではありませんが、UUIDを長さに刻むのはどうですか?それはグローバルにユニークではありません - グローバルにユニークな識別子を取得しないことに注意してください - しかし、それは地元でユニークに機能するかもしれません。
新しいIDが要求されるたびに、1つずつ増分する永続的なカウンターを保持します。
データファイルがSQLテーブルである場合は、いつでもMax(ID) + 1を選択してそれを使用できますが、2つのIDが同時に必要な場合にマルチタスクの問題に遭遇しないことを絶対に確認する必要があります(そしてそれらはどちらもMax(ID)から同じ値を持っています。ほとんどのデータベースには、この目的のために設計されたネイティブデータタイプがあり、その施設を使用する必要がある場合は、その施設を使用する必要があることに注意してください。