1. Perl / Говнокод #9748

    −119

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 23 Марта 2012

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

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

      Помню на одном проекте использовали ActivePerl 5.12, там rand на рабочей машине стал выдавать одинаковые последовательности от запуска к запуску . Тогда мы использовали модуль Math::Random::MT и все нормализовалось.
      Ответить
      • Чтобы не вылезти за границы массива $rand % $itoa_len было бы разуменее. А учитывая потенциальный бесконечный while, если в $itoa_len окажется число типа 00000001000b ...
        Ответить
        • Ну собственный велосипед, как полагается почти всем велосипедам, слегка кривоват ))
          Ответить
    • показать все, что скрытоvanished
      Ответить

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