2012-02-23 93 views
-1

我試圖實現一個隨機數生成器系統;基本上我在讀在SHA1哈希值,然後把它轉化成一個BigInteger值:將Java BigInteger縮小爲固定長度的較小數字

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,值爲:

811203900027758629330492243480887228261034167773619203962320290854945165232584286910163772258660 

我需要以某種方式做什麼(這就是我感到困惑的地方),就是把這個數字減少到一個數量更小的數字,並且有一個固定的小數位數。

結合使用模塊化算術和Java Math API函數,是否有合理的方法將此數字降低爲3位數字。或我選擇的任何其他長度的號碼。

目前我只是簡單地將這個龐大的數字轉換爲一個字符串,然後取一個我想要的數字長度的子字符串。然而,我並不完全滿意,因爲我得到的數字並不是隨機的,因爲範圍有點侷限於3位數字。

這樣做的全部目的是爲了將新生成的隨機x位數字轉換爲一個使用36基數的字符串,還包括ASCII字母字符。

任何信息或建議將不勝感激。

謝謝!

+3

所以你想要3位數字,但你不想要3位數字,因爲它們是有限的?我不明白... – m0skit0 2012-02-23 12:39:53

+0

他想要x個數字 - 取決於具體情況... – DaveFar 2012-02-23 12:46:12

+0

該整數是散列值「a9993e364706816aba3e25717850c26c9cd0d89d」的ASCII十六進制表示,所以它是需要的兩倍。谷歌搜索上面顯示,這是哈希......好吧,你可以谷歌它自己。 – 2012-02-23 12:57:58

回答

1

是的,你可以使用像模或.mod(1000)爲基地36 .mod(36*36*36)甚至普通.longValue() % 1000.longValue() % (36*36*36)

您可以使用Long.toString(x, 10)Long.toString(x, 36)

不知道我可以說沒有給你答案更多。

+0

謝謝彼得,那正是我需要的! – Tony 2012-02-23 13:07:58

+0

注意:這不是完整的答案,但應指向正確的方向。 – 2012-02-23 13:10:40

+0

它確實謝謝你。我只是想要一些模塊化處理大數字的指針,這就是你給我的。我從來沒有要求完整的答案,只是建議:)謝謝老兄。 – Tony 2012-02-23 13:28:34

相關問題