Как сгенерировать все возможные 64-битные случайные значения в java?

Возвращает ли Java SecureRandom.nextLong() все возможные значения, учитывая, что он наследуется от Random, который использует только 48 бит? Если нет, могу ли я сделать это на Java, возможно, изменив класс Random и как это сделать? Я просто хочу использовать генератор случайных длинных чисел, в котором могут быть возвращены все возможные длинные значения, если это возможно.


person mj1261829    schedule 05.08.2018    source источник
comment
Меня немного смущает формулировка вопроса. Я предполагаю, что вы не хотите генерировать все возможные значения Long. Я предполагаю, что вам нужно случайное число из набора всех возможных значений Long?   -  person Software Engineer    schedule 05.08.2018
comment
Если вам действительно нужно случайное число (не основанное на дискретной математике), вам следует посетить некоторые онлайн-сайты. Например: random.org   -  person zlakad    schedule 05.08.2018
comment
@zlakad, если вы не хотите, чтобы он был криптографически безопасным, и в этом случае вы определенно не хотите получать случайные данные из другого источника.   -  person Peter Lawrey    schedule 05.08.2018
comment
@PeterLawrey, да, я понимаю, что ты имеешь в виду. Я написал алгоритм на ассемблере для процессора Z80 для поколений случайных битов еще в 1982-83 годах. Боже, я все забыл об этом!   -  person zlakad    schedule 05.08.2018
comment
Да, из набора всех возможных длинных значений и не обязательно всех длинных значений.   -  person mj1261829    schedule 05.08.2018
comment
Веб-сайты @zlakad могут записывать ваши случайные числа или быть взломаны для их записи. Зачем кому-то беспокоиться? Когда у вас есть приватные ключи стоимостью ~$1 млрд, etherscan.io/accounts запись источников случайных данных становится интересной для некоторых .   -  person Peter Lawrey    schedule 05.08.2018
comment
@PeterLawrey Согласен!   -  person zlakad    schedule 05.08.2018


Ответы (1)


Хотя SecureRandom наследуется от Random, он не использует ту же математику и не имеет таких же ограничений. В конечном итоге он выдаст все возможные 64-битные значения.

Этот класс предоставляет криптографически стойкий генератор случайных чисел (RNG).

Этот класс делегирует одну из многих возможных реализаций. Вы можете выбрать один, позвонив SecureRandom.getInstance(algorithm)

Примечание: некоторые реализации используют энтропию на вашем компьютере, чтобы сделать результаты случайными, а не чисто псевдослучайными.

здесь используется 48-битный алгоритм

SecureRandom не использует какие-либо методы своего родителя, например.

/**
 * The provider implementation.
 */
private SecureRandomSpi secureRandomSpi = null;

public void nextBytes(byte[] bytes) {
    secureRandomSpi.engineNextBytes(bytes);
}

Этот метод делегирует совершенно другую реализацию.

Связанная ссылка Как решить медленную Java `SecureRandom`? из-за использования /dev /случайный

person Peter Lawrey    schedule 05.08.2018
comment
Я надеюсь, что это правда - person mj1261829; 05.08.2018
comment
проголосовал за, так как разделяю понимание @PeterLawrey - person sschrass; 05.08.2018
comment
@EngineerDollery К сожалению, Random не является интерфейсом, но широко используется, поэтому дизайнеры решили расширить Random, но заменить его совершенно другой реализацией, но, поскольку он расширяет Random, его можно использовать в качестве замены. - person Peter Lawrey; 05.08.2018
comment
Хорошо, минус удален. Мне надоело с тобой спорить ;) - person Software Engineer; 05.08.2018