Java: 80-битное число (ищите хороший подход) - PullRequest
1 голос
/ 06 марта 2012

Мне нужно сгенерировать 80-битное случайное число (не повторяющееся) в Java.

Как я могу это сделать?

Я планирую сделать это, используя текущие метки времени. Это даст мне 8 байтов, а остальное - 2 байта. Я могу добавить что-то еще .... пожалуйста, дайте мне знать ваши комментарии и как я могу это сделать ...

Или, если у вас есть другая идея, реализовать то же самое ...

Пожалуйста, рассмотрите случай перезагрузки системы

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

Попробуйте использовать комбинацию Random#nextBytes(byte[]) и new BigInteger(byte[]):

Random rand = new Random();
BigInteger r = new BigInteger(80, rand);
// or
byte bs[10];
rand.nextBytes(bs);
BigInteger r80bits = new BigInteger(bs);

[Редактировать] Звучит как выВы больше заинтересованы в уникальности, чем в случайности, особенно если у вас мало шансов когда-либо использовать одно и то же число, и в этом случае отметка времени может оказаться более полезной.Вот способ достижения этого, более или менее:

public static byte[] get80UniqueBits() {
  // Put eight very likely unique bytes.
  ByteBuffer buf = ByteBuffer.allocate(10);
  buf.putLong(System.nanoTime());
  // And two random bytes for good measure.
  byte bytes[] = {0, 0};
  new Random().nextBytes(bytes);
  buf.put(bytes, 0, 2);
  return buf.array();
}

Обратите внимание, что последние два байта не являются строго необходимыми.

1 голос
/ 06 марта 2012

Отметка времени не совсем случайна в том смысле, в каком вы имеете в виду. На самом деле это даже не псевдослучайное в том смысле, что оно всегда увеличивается.

Если вам нужен 80-битный генератор, я реализовал нечто подобное раньше, но с меньшим выходом из функции генератора.

В основном вы используете nextLong, чтобы получить 64-битное случайное значение. Затем вы копируете оттуда биты в другие 16-битные позиции.

Способ, которым вы можете увидеть 64-битный цикл, состоит в том, что позиции битов, которые вы копируете («набор битов»), отличаются на каждой итерации, и существует простое число итераций (11, 31, 97, ... ).

Так, например, на итерации 0 вы можете скопировать биты 1, 7, 9, 11, 3, ... 12 в другие 16-битовые позиции. На следующей итерации вы скопируете другой набор битов.

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

Конечно, лучшим решением было бы найти подлинный 80-битный генератор - я просто предлагаю это как решение для ускорения работы. Если вы не криптограф или статистик, все будет хорошо (но, опять же, 64-битный генератор будет вызываться дважды со смещенными и объединенными значениями, вероятно).

0 голосов
/ 06 марта 2012
Random generator = new Random();
new BigInteger(80, generator);

Если вам не нужны дубликаты чисел, нет и не будет никакого способа избежать этого, кроме явного сохранения Set ранее увиденных чисел и проверки на это Set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...