3

私はRandomStringUtilsデータベースキーとして使用されるランダムIDを生成するために使用してきました:

import org.apache.commons.lang.RandomStringUtils;
public class RandomStringTest {
    public static void main(final String[] args) {
        for (int i = 0; i <= 10; i++) {
            final String id = RandomStringUtils.random(8,
                    "0123456789abcdefghijklmnopqrstuvwxyz");
            System.out.println(id);
        }
    }
}

キースペースは十分に大きいですが、

len("0123456789abcdefghijklmnopqrstuvwxyz")^8 = 2821109907456 ≃ 10^12

ランダムメカニズムは適切にシードされていますか?これを本番環境に適用する前に、キーが適切に配布されていることを知っておく必要があります。

ちなみに、テストコードは数回実行しても繰り返しは見られませんでしたが、それは確かな証拠にはほど遠いです。

4

2 に答える 2

4

私が見つけた実装にはシードが提供されていません。ただありnew Random()ます。しかし、独自のランダム性のソースを提供できる方法があります

random(int count, int start, int end, 
        boolean letters, boolean numbers, 
        char[] chars, java.util.Random random)
于 2012-06-27T15:01:34.217 に答える
0

一意のキーを生成するためにランダムジェネレーターを使用しないでください。一意性を保証するものはありません。代わりにUUIDジェネレーター、またはデータベースシーケンスを使用してみませんか?

そして、なぜあなたはあなたの鍵が適切に配布されることを望むのですか?主キーにとって重要なのは、その一意性だけです。そして、シードはディストリビューションに影響を与えません、AFAIK。

于 2012-06-27T15:03:02.420 に答える