2012-04-20

[trick] чтение из /dev/[u]random

Баг: генератор ключей выдает один и тот же ключ, если интервал между запусками достаточно мал.

Лезу в код, вижу примерно такое.

template <typename T>
RandomGenerator::RandomGenerator() {
  T seed = 0;
  {
    std::ifstream in("/dev/urandom");
    in >> seed;
  }
  if (!seed)
    seed = clock(NULL);
  ... // далее seed используется, чтобы инициализировать один из бустовских ГПСЧ.
}

Далее этот класс инстанциируется для T = uint32_t.
Первое, что бросается в глаза, что /dev/urandom мы открываем как текстовый файл. А потом пытаемся читать из него 4хбайтное целое.

Добавил ios::binary -- лучше не стало.

Вынес в отдельный файл, стал экспериментировать.
Не читается uint32 из '/dev/random'.
Поменял тип на char - читает.
На short - опять не читает.
И такое поведение одинаково на osx, linux и freebsd.

А потом я вспомнил, что /dev/[u]random - это character device.

Комментариев нет:

Отправить комментарий