=()= / Говнокод #9748 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
sub create_sid {
    my $uid = shift @_;
    
    return undef if (!defined $uid);
    
    my $sid;
    my $rand = 1;
    my $is_ok = 0;
    my(@itoa) = ('0' .. '9','a' .. 'z','A' .. 'Z');
    my $itoa_len = $#itoa;
    
    while ($is_ok != 1){
		$sid = '';
		for(0..8) {						#создание нового сида
		    $rand = rand(25*240*17 + $rand + $uid);
		    $sid .= $itoa[$rand & $itoa_len];
		}
		my $exists = $RR::Init::memd->get('sid'.$sid);		#проверка что такого не существует
		$is_ok = 1 if (!defined $exists);
    }
    return $sid;
}

Смотрим на $itoa[$rand & $itoa_len] и офигеваем=)

Запостил: PSIAlt PSIAlt, (Updated )

Комментарии (5) RSS

  • $rand & $itoa_len , я как понимаю чтобы не вылезти за пределы массива, налицо попытка создать еще более рандомный алгоритм, чем встроенный rand.

    Помню на одном проекте использовали ActivePerl 5.12, там rand на рабочей машине стал выдавать одинаковые последовательности от запуска к запуску . Тогда мы использовали модуль Math::Random::MT и все нормализовалось.
    Ответить
    • Чтобы не вылезти за границы массива $rand % $itoa_len было бы разуменее. А учитывая потенциальный бесконечный while, если в $itoa_len окажется число типа 00000001000b ...
      Ответить
      • Ну собственный велосипед, как полагается почти всем велосипедам, слегка кривоват ))
        Ответить
  • ж$G.H.Q$K(A,K.E!P.N,E GA:XR:S(Z.I?A!C,H,F F)D"O:EX(OМUFINSNQLIHOOXOZBILAWLMN
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8