2010-08-26 203 views
0

我有問題在一個字符串(一個人的名字),回來一個獨特的整數,它繼續通過catch函數,我不知道爲什麼,除了我寫SecureRandom的方式不起作用,但它非常混亂。我對編程非常陌生,所以請善待!將SecureRandom和UUID轉換爲int(java)?

public static int uinqueID(String name){ 
    try{ 
     SecureRandom srA = SecureRandom.getInstance(name); 
     Integer randomA = new Integer(srA.nextInt()); 
     System.out.println(randomA); 
     UUID uuidA = UUID.randomUUID(); 
     String randomNum2 = uuidA.toString(); 
     System.out.println(randomNum2); 
     int randomB = Integer.valueOf(randomNum2); 
     int uniqueID = randomA + randomB; 
     return uniqueID; 
    } catch(NoSuchAlgorithmException e) { 
     System.err.println("I failed"); 
    } 
    return -1; 
    } 

我得到的輸出是: 我失敗 -1

謝謝您的幫助!

回答

1

您不能使用此人的名稱來獲得SecureRandom對象。它期望在實現一個隨機數生成器的名稱。您可以使用「SHA1PRNG」,因爲它是默認可用的。然後,您可以使用name.getBytes()對隨機生成器進行播種,然後獲取下一個隨機數。

從的Javadoc:

公共靜態的SecureRandom的getInstance(字符串算法) 拋出拋出:NoSuchAlgorithmException 生成SecureRandom對象是...略...

參數: 算法 - PRNG算法的名稱。請參閱Java密碼體系結構API規範&中的附錄A,以獲取有關標準PRNG算法名稱的信息。

返回: 新的SecureRandom對象。 拋出: NoSuchAlgorithmException - 如果PRNG算法在調用方環境中不可用。 從以下版本開始: 1.2

您可以跳過其餘部分,因爲哈希與算法一樣好,並且向其添加其他內容幾乎不會使其更安全。

類似:

static int getUUID(String name) throws NoSuchAlgorithmException { 
    SecureRandom srA = SecureRandom.getInstance("SHA1PRNG"); 
    srA.setSeed(name.getBytes()); 
    return new Integer(srA.nextInt()); 
} 

我會通常使用一個MessageDigest,但我必須承認,這是相當緊張。

+0

OK!這更有意義,那麼我可以使用該名稱作爲字節數組中的種子嗎? – Jack 2010-08-26 20:36:44

+0

是的,我加了一個例子。 – 2010-08-26 20:45:24

0

根據該文檔,NoSuchAlgorithmException拋出

...當請求特定的加密算法,但不具備的環境。

您需要指定一個隨機數發生器(RNG)算法getInstance(String algorithm),而不是一個人的名字。

如果你只是需要一個隨機數,嘗試用

SecureRandom srA = new SecureRandom(); 

替換該行代碼中的。如果你不關心多少有隨機的和你只是想創建一個唯一的整數這個名字,那麼我認爲你所需要的就是致電hashCode這個名字。

0

如果要將字符串映射到數字,您需要散列函數或摘要。看看java.security.MessageDigest中

0

什麼:

static final long getUUID() throws NoSuchAlgorithmException { 
     SecureRandom srA = SecureRandom.getInstance("SHA1PRNG"); 
     srA.setSeed(RandomUtils.nextLong()); 
     return new Long(srA.nextInt()); 
    } 


    static final String getFixedLengthUUID() { 
     try { 
     return Long.toHexString(Math.abs(getUUID())) + Long.toHexString(Math.abs(getUUID())); 
     } catch (Exception e) { 
     return null; 
    } 
} 

這種打印出的數字與16個字符:

3fc2ce6b4da08fe0 
3fba60e0b8387c58 
78cb09b976b112d3 
3c28f91c473e29ba 
203af64d1e747af6 
4934d0b4342b8f30 
3b576a97ba8f857 
76d49522cecc5c4 
5cf650ed72a55b50 
1e89acfb4a4589f3