ฉันจะสร้างอาร์เรย์แบบสุ่ม 20 ไบต์ใน Java ได้อย่างไร
ฉันจะสร้างอาร์เรย์แบบสุ่ม 20 ไบต์ใน Java ได้อย่างไร
คำตอบ:
ลองใช้Random.nextBytes
วิธี:
byte[] b = new byte[20];
new Random().nextBytes(b);
หากคุณต้องการตัวสร้างตัวเลขสุ่มที่มีการเข้ารหัสที่แข็งแกร่ง (รวมถึงเธรดที่ปลอดภัย) โดยไม่ต้องใช้ API ของบุคคลที่สามคุณสามารถใช้SecureRandom
.
Java 6 และ 7:
SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);
Java 8 (ปลอดภัยยิ่งขึ้น):
byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);
หากคุณใช้ Apache Commons Lang อยู่แล้วสิ่ง RandomUtils
นี้จะทำให้เป็นหนึ่งซับ:
byte[] randomBytes = RandomUtils.nextBytes(20);
Java 7 แนะนำThreadLocalRandomซึ่งเป็นแยกเธรดปัจจุบัน
นี่คือความหมายของอีกวิธีการแก้ปัญหาของ maerics
final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
ThreadLocalRandom
หรือไม่ Better:ThreadLocalRandom.current().nextBytes(bytes);
สร้างวัตถุสุ่มด้วยเมล็ดพันธุ์และรับอาร์เรย์แบบสุ่มโดยทำ:
public static final int ARRAY_LENGTH = 20;
byte[] byteArray = new byte[ARRAY_LENGTH];
new Random(System.currentTimeMillis()).nextBytes(byteArray);
// get fisrt element
System.out.println("Random byte: " + byteArray[0]);
สำหรับผู้ที่ต้องการวิธีที่ปลอดภัยยิ่งขึ้นในการสร้างอาร์เรย์ไบต์แบบสุ่มใช่วิธีที่ปลอดภัยที่สุดคือ:
byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);
แต่เธรดของคุณอาจปิดกั้นหากมีการสุ่มไม่เพียงพอในเครื่องทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการของคุณ วิธีแก้ปัญหาต่อไปนี้จะไม่ปิดกั้น:
SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);
เนื่องจากตัวอย่างแรกใช้/dev/random
และจะบล็อกในขณะที่รอการสุ่มเพิ่มเติม (สร้างโดยเมาส์ / แป้นพิมพ์และแหล่งอื่น ๆ ) ตัวอย่างที่สองใช้/dev/urandom
ซึ่งจะไม่ปิดกั้น