在 Java 中使用 SecureRandom 產生唯一的正長整數
1. 概述
SecureRandom
類別位於java.security
套件中,專為加密目的和關鍵安全情況而設計,使用確保高度不可預測性的演算法。
在本教學中,我們將討論使用SecureRandom
產生唯一的正長整數值,並探討產生多個值時避免衝突的安全性。
2.使用nextLong()
SecureRandom
的nextLong()
方法傳回一個long
類型的值,它是一個隨機的 64 位數。這些值隨機分佈在極寬的值範圍內,從Long.MIN_VALUE
(-2^63) 到Long.MAX_VALUE
(2^63 – 1)。
此方法繼承自Random
類別。然而,由於使用更多數量的種子位,因此在衝突機率方面保證更安全。
在底層,它使用偽隨機數產生器 (PRNG)(也稱為確定性隨機位元產生器或 DRBG )與作業系統提供的熵來源結合。
讓我們看看如何使用它來產生隨機long
值:
new SecureRandom().nextLong();
如果我們列印此方法呼叫的一些結果,我們可能會看到如下輸出:
4926557902899092186
-2282075914544479463
-4653180235857827604
6589027106659854836
因此,如果我們只需要正值,那麼我們還需要使用Math.abs()
:
SecureRandom secureRandom = new SecureRandom();
long randomPositiveLong = Math.abs(secureRandom.nextLong());
這樣,就可以保證結果永遠為正:
assertThat(randomPositiveLong).isNotNegative();
3. 碰撞機率
因為我們需要產生唯一的值,所以確保碰撞的機率夠低非常重要。
正如我們上面提到的, nextLong()
方法產生一個範圍從 -2^63 到 2^63 – 1 的 64 位元隨機long
值。隨後,透過應用Math.abs()
,我們消除任何負號,從而產生範圍從0 到2^62 – 1。
因此,碰撞機率計算為 1 / 2^62。以十進位形式表示,此機率約為 0.000000000000000000216840434497100900。對於大多數實際應用,我們可以認為這個低機率是微不足道的。
假設它每秒產生一個值,平均而言,在大約(2^62) / (60) / (60) / (24) / (365.25) 年(即大約146,135,511,523 年)的時間內只會發生一次碰撞。延長的時間進一步凸顯了碰撞事件的罕見性。
4。結論
在本文中,我們討論如何使用SecureRandom
產生唯一的long
值。這種方法被認為是有效的,因為它確保了高度的不可預測性,並且碰撞的機率對於大多數應用來說是微不足道的,因此它適合在各種情況下使用。
與往常一樣,完整的源代碼可以在 GitHub 上取得。