如何產生 N 位元組的隨機位元組數組
1. 概述
有多種方法可以產生隨機位元組數組,每種方法適合不同的需求。在本教程中,我們將探索三種方法:使用內建java.util.Random
類別、加密安全java.security.SecureRandom
和 Apache Commons 實用程序,包括RandomUtils
和UniformRandomProvider
。
在本教程結束時,我們將全面了解如何產生任意大小的隨機位元組數組,以及何時選擇每種方法。
2. 使用Random
java.util.Random
類別提供了一種產生隨機位元組數組的簡單方法。它非常適合效能比安全性更重要的場景,例如產生用於測試的非敏感隨機資料:
@Test
public void givenSizeWhenGenerateUsingRandomThenOK() {
byte[] byteArray = new byte[SIZE];
Random random = new Random();
random.nextBytes(byteArray);
assertEquals(SIZE, byteArray.length);
}
由於Random
在加密上不安全,因此我們不應該將其用於安全敏感資料。
3.使用SecureRandom
當產生必須安全且不可預測的隨機資料時, SecureRandom
是首選。它專門設計用於產生加密的強隨機值:
@Test
public void givenSizeWhenGenerateUsingSecureRandomThenOK() {
byte[] byteArray = new byte[SIZE];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(byteArray);
assertEquals(SIZE, byteArray.length);
}
SecureRandom
速度較慢,但對於產生安全隨機資料是必需的。
4. 使用 Apache Commons
Apache Commons Lang 提供了RandomUtils
類,該類別提供了用於產生隨機資料的附加方法。要使用 Apache Commons Lang,我們在pom.xml
檔案中新增commons-lang3依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.16.0</version>
</dependency>
此實用程式類別簡化了流程並與其他 Commons Lang 功能無縫整合。
讓我們看看它的實際效果:
@Test
public void givenSizeWhenGenerateUsingRandomUtilsThenOK() {
byte[] byteArray = RandomUtils.nextBytes(SIZE);
assertEquals(SIZE, byteArray.length);
}
但是,需要注意的是, RandomUtils
現在已棄用,建議使用Apache Commons RNG 。 Apache Commons RNG 提供了一種更強大、更有效率的方法來產生隨機資料。要使用它,我們需要包含commons-rng-simple依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-rng-simple</artifactId>
<version>1.6</version>
</dependency>
讓我們使用 Apache Commons RNG 中的UniformRandomProvider
來產生一個隨機位元組數組:
@Test
public void givenSizeWhenGenerateUsingUniformRandomProviderThenOK() {
byte[] byteArray = new byte[SIZE];
UniformRandomProvider randomProvider = RandomSource.XO_RO_SHI_RO_128_PP.create();
randomProvider.nextBytes(byteArray);
assertEquals(SIZE, byteArray.length);
}
UniformRandomProvider
不僅提供了用於生成隨機資料的更可靠和最新的 API,而且還優於討論的其他方法(包括Random
,使其成為最快的選擇。
UniformRandomProvider
優於其他方法,因為它是基於XO_RO_SHI_RO_128_PP
等現代演算法構建的,XO_RO_SHI_RO_128_PP 是XOR 移位演算法的變體。與Random
等舊實作相比,該演算法在速度、統計品質和記憶體效率之間提供了更好的平衡。
XO_RO_SHI_RO
系列演算法可提供速度並確保較長的周期,這對於高效能應用程式至關重要。
此外, Apache Commons RNG 還提供了多種其他演算法來滿足不同的需求,例如MT
( Mersenne Twister ) 和SPLIT_MIX_64
。
5. 結論
在本文中,我們探討了產生隨機位元組陣列的三種不同方法:使用java.util.Random
、 java.security.SecureRandom
和 Apache Commons。每種方法都有其優點並且適合不同的場景。透過了解這些選項,我們可以選擇最適合我們特定要求的方法,無論我們需要效能、安全性或便利性。
與往常一樣,原始碼可以在 GitHub 上取得。