0

以下のコードを使用してファイルの ID を生成する場合、誰でも提案できますか?それは常に一意になりますか? 100 のフォームが自動的にフォームを作成し、ID テキストボックスに ID が自動入力されます。したがって、スレッドセーフである必要があり、アプリケーションを再起動した場合、アプリケーションがいつでも停止する前に既に生成された ID を繰り返すべきではありません。

  private static final AtomicLong count = new AtomicLong(0L);  
    public static String generateIdforFile()  
    {
        String timeString = Long.toString(System.currentTimeMillis(), 36);
        String counterString = Long.toString(counter.incrementAndGet() % 1000, 36);
        return timeString + counterString;
    }

また、フォームは ClassName.generateIdforFile(); を使用して Id を取得しています。

4

3 に答える 3

1

UUIDファイルIDにaを使用しないのはなぜですか? 次のようなものを使用できます。

public static String generateIdforFile()  {
    return UUID.randomUUID().toString();
}

それとも、(進行中の) 数値が必要ですか?

数値が数値である必要がある (そして継続的ではない) 場合は、数値にUUID#getLeastSignificantBits()orを使用できます。UUID#getMostSignificantBits()

SO でこの回答を引用する:

したがって、UUID の最上位半分には 58 ビットのランダム性が含まれます。つまり、衝突を起こすには平均で 2^29 個の UUID を生成する必要があります (完全な UUID の 2^61 と比較して)。

もちろん、完全な UUID を使用する場合ほど安全ではありません。

于 2013-10-14T09:27:27.277 に答える
0

AtomicLongアプリケーション全体で から始まるグローバルを使用する0Lことをお勧めします。次に、と連結しCurrentTimeMillisます。

static AtomicLong counter = new AtomicLong(0L);

public static String generateIdforFile()  
{
    String timeString = Long.toString(System.currentTimeMillis(), 36);
    String counterString = Long.toString(counter.incrementAndGet() % 1000, 36);
    return timeString + counterString;
}

アプリのシャットダウンと再起動に数ミリ秒以上かかる場合は、アプリケーションの再起動間であっても、一意の ID が生成される可能性が高くなります。メソッドはもう同期されていないことに注意してください。(必要ありません)また、同じミリ秒で作成するファイルが1,000未満であることも条件です。ただし、普遍的な一意性を保証することはできません。

于 2013-10-14T08:38:17.783 に答える
0

If you are making method as synchronized there is no need to use AtomicLong variables.

Because concurrency is ensured by using synchronized keyword.

Using excessive concurrent variables hampers efficiency and performance of application.

于 2013-10-14T08:18:06.683 に答える