Jak mogę utworzyć tablicę 20 losowych bajtów w Javie?
133
Wypróbuj Random.nextBytes
metodę:
byte[] b = new byte[20];
new Random().nextBytes(b);
Jeśli chcesz mieć silny kryptograficznie generator liczb losowych (również bezpieczny wątkowo) bez korzystania z interfejsu API innej firmy, możesz użyć SecureRandom
.
Java 6 i 7:
SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);
Java 8 (jeszcze bezpieczniejsza):
byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);
Jeśli korzystasz już z Apache Commons Lang, to RandomUtils
sprawia , że jest to jedna linijka:
byte[] randomBytes = RandomUtils.nextBytes(20);
Java 7 wprowadziła ThreadLocalRandom, który jest odizolowany od bieżącego wątku .
To kolejna interpretacja rozwiązania Maerics .
final byte[] bytes = new byte[20]; ThreadLocalRandom.current().nextBytes(bytes);
źródło
ThreadLocalRandom
? Lepiej:ThreadLocalRandom.current().nextBytes(bytes);
Utwórz obiekt Random z ziarnem i uzyskaj tablicę losowo, wykonując:
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]);
źródło
Dla tych, którzy chcą bezpieczniejszego sposobu tworzenia losowej tablicy bajtów, tak, najbezpieczniejszym sposobem jest:
byte[] bytes = new byte[20]; SecureRandom.getInstanceStrong().nextBytes(bytes);
ALE twoje wątki mogą blokować się, jeśli na komputerze nie ma wystarczającej ilości losowości, w zależności od systemu operacyjnego. Poniższe rozwiązanie nie będzie blokować:
SecureRandom random = new SecureRandom(); byte[] bytes = new byte[20]; random.nextBytes(bytes);
Dzieje się tak, ponieważ pierwszy przykład używa
/dev/random
i będzie blokował podczas oczekiwania na większą losowość (generowaną przez mysz / klawiaturę i inne źródła). Drugi przykład używa,/dev/urandom
które nie będą blokować.źródło