2

ユーザーがトランザクションを自分のアカウントにリンクするために Web サイトに入力する番号を生成するユーザー ケースがあります。

だから私はランダムな12桁の数字を生成する次のコードを持っています:

public String getRedemptionCode(long utid, long userId) {       
    long nano = System.nanoTime();      
    long temp = nano + utid + 1232;
    long redemptionCode = temp + userId + 5465;     
    if (redemptionCode < 0) {
        redemptionCode = Math.abs(redemptionCode);
    }       
    String redemptionCodeFinal = StringUtils.rightPad(String.valueOf(redemptionCode), 12, '1');
    redemptionCodeFinal = redemptionCodeFinal.substring(0, 12);
    return redemptionCodeFinal;
}

このメソッドは、DB によって生成される 2 つのパラメーターを受け取ります。

私が理解する必要があるのは次のとおりです。

  1. これはランダムですか?このメソッドを 100 万回実行したテストがあり、常にランダムに見えます。

  2. これを8文字に減らしてもいいですか?

4

2 に答える 2

2

これはランダムですか?

あなたの関数System.nanoTime()は乱数発生器 ( RNG ) に基づいていますか?

RNG の定義は次のとおりです

では、関数からパターンなしで数値が返されますか?

System.nanoTime()いいえ、それらは(システムクロック)に依存しているため、簡単に観察できるパターンを持っています。

これを8文字に減らしてもいいですか?

はい、できますが、それでもランダムではありません。追加またはパディングも役に立ちません。

SecureRandom代わりに使用してください。

于 2013-10-08T15:47:58.510 に答える