2012-02-23 4 views
-1

乱数生成システムを実装しようとしています。 (私は何とかやるに必要なものJava BigIntegerを固定長のより小さい数に減らす

811203900027758629330492243480887228261034167773619203962320290854945165232584286910163772258660 

String start = "abc"; 
String hash = utils.SHA1(start); //Generates an SHA1 hash of the string 
byte[] bytes = hash.getBytes(); 
BigInteger big = new BigInteger(bytes); 

このコードは、の値とのBigIntegerを生成します。基本的に私は、その後のBigInteger値に変換されるSHA1ハッシュ、で読んでいますこれは私が混乱するところです)、その数を固定小数点数ではるかに短い数に減らしています。

モジュラ算術とJava Math API関数を組み合わせて使用​​すると、この数値を3桁の数値に減らすことができます。または私が選んだ他の長さの番号。

現時点では、私は巨大数をStringに変換してから、必要な長さの部分文字列を取ります。しかし、私はこの数字が3桁の数字に限られているので、私はその数字がランダムではないので、これで全然満足しているわけではありません。

これは、新しく生成されたランダムx桁数を基数36を使用して文字列に変換し、ASCIIアルファベット文字を含むことを目的としています。

何か情報やアドバイスをいただければ幸いです。

ありがとうございます!

+3

3桁が必要ですが、制限されているため3桁は必要ありません。私は理解していません... – m0skit0

+0

状況に応じてx桁が必要です... – DaveFar

+0

その整数は、ハッシュ値のASCII 16進表現、 'a9993e364706816aba3e25717850c26c9cd0d89d'であり、必要な値の2倍です。上記のグーグルでは、それが...のハッシュであることが明らかになります。 –

答えて

1

あなたは私はあなたに答えを与えることなく、はるかに伝えることができわからないLong.toString(x, 10)またはLong.toString(x, 36)

を使用することができます.mod(1000)ようまたはベース36 .mod(36*36*36)あるいは無地.longValue() % 1000または.longValue() % (36*36*36)

のためにはいあなたは係数を使用することができます。

+0

ピーターに感謝します。 – Tony

+0

注:これは完全な答えではありませんが、正しい方向に向けるべきです。 –

+0

ありがとうございました。私はちょうど巨大な数値のモジュラ操作に関するいくつかの指針を求めていました。それがあなたが私に与えたものです。私は決して完全な答えをとにかく頼んだことはありません、ちょうど助言:)ありがとう男。 – Tony

関連する問題