Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Сложный Легкий накопительный RND-генератор (финальный вариант, наверное) 23.07.03 09:56 Число просмотров: 2707
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
Не такой уж и легкий, а достаточно навороченый.
Все, конечно, хорошо, вот только медленный должен быть (более сотни тактов на генерацию).
Хотя на современных гигагерцовых процессорах это не заметно будет.
Сначала речь шла о каком-то устройстве. Эту штуку что, аппаратно реализовывать надо будет? Или в состав устройства будет входить компьютер на базе процессора Пентиум4? Для устройства-то лучше что-нибудь на основе "железного" RNG. Приведенный алгоритм не очень-то и прост для аппаратной реализации.
Думаю, если массивчик раза в два или в четыре покороче сделать - стойкость сильно не упадет.
Самое главное, чтобы LYSAP_RandomPushSalt достаточно часто вызывался. Через раз достаточно будет. А то вдруг на милион LYSAP_GetRandom один LYSAP_RandomPushSalt придется.
> > unsigned LYSAP_GetRandom()
> {
> unsigned __int32 Value =
> Random.Pool[Random.Tail] // X ** 1
> ^ Random.Pool[(Random.Tail + 1) & 63] // X ** 64
> ^ Random.Pool[(Random.Tail + 62) & 63] // X ** 4
> ^ Random.Pool[(Random.Tail + 61) & 63]; // X ** 3
>
> unsigned __int32 Salt =
> 1 // may be any non-zero
> + ROT_L(Random.Pool[(Random.Tail + 11) & 63], 5)
> + ROT_L(Random.Pool[(Random.Tail + 23) & 63], 7)
> + ROT_L(Random.Pool[(Random.Tail + 37) & 63], 1);
>
> Value += Salt; Value += Value < Salt; // cyclic
> addition with carry
> Random.Pool[Random.Tail = (Random.Tail + 1) & 63] =
> Value;
> return Value;
> } ---
|
|
|