|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : HB 2:5020/400 18 Jul 2001 15:13:45 To : All Subject : Как HЕ нужно генерировать unique id (was: Re: unique visitors) -------------------------------------------------------------------------------- kan wrote in <995344771@p1.f69.n5050.z2.ftn>... >C:\Program Files\Far>perl >print (time.{}.$$."blah") >^Z >995344520HASH(0x1a7f10c)96blah > >Т.е. это пpосто для выделения памяти под новый хэш, адpес >не может быть одним и тем же. Еще как может. Вы, по непонятным мне причинам, полагаете, что 2 процесса, у к-рых в одном и том же месте программы time() возвращает одно и то же, запущены *одновременно*. Следовательно, и pids у них разные, и на одну и ту же область памяти они не могут ссылаться, и т. п... Беда в том, что один и тот же time() не означает одного момента времени. Он означает одну до-олгую *эпоху* длиной 1 сек. Ладно, от слов -- к делу. Все проверяется под Windows NT 4.0 (про Unix пару слов в конце) c:\> for /l %i in (1, 1, 100) do @perl -lwe "print time, {}, $$" >>log c:\> perl -we "++$h{$_} while <>; for (keys %h) {print(qq'$h{$_} times: $_'), $n+=$h{$_} if $h{$_}>1; } print qq'Not unique: $n out of 100\n'" log 7 times: 995453089HASH(0x1b9f05c)273 2 times: 995453088HASH(0x1b9f05c)260 7 times: 995453089HASH(0x1b9f05c)292 7 times: 995453089HASH(0x1b9f05c)268 2 times: 995453088HASH(0x1b9f05c)280 2 times: 995453088HASH(0x1b9f05c)263 7 times: 995453089HASH(0x1b9f05c)286 2 times: 995453088HASH(0x1b9f05c)246 7 times: 995453089HASH(0x1b9f05c)297 7 times: 995453089HASH(0x1b9f05c)289 2 times: 995453088HASH(0x1b9f05c)292 7 times: 995453089HASH(0x1b9f05c)299 2 times: 995453088HASH(0x1b9f05c)268 2 times: 995453088HASH(0x1b9f05c)286 7 times: 995453089HASH(0x1b9f05c)260 2 times: 995453088HASH(0x1b9f05c)297 2 times: 995453088HASH(0x1b9f05c)289 7 times: 995453089HASH(0x1b9f05c)280 7 times: 995453089HASH(0x1b9f05c)246 7 times: 995453089HASH(0x1b9f05c)263 2 times: 995453088HASH(0x1b9f05c)299 Not unique: 97 out of 100 Из 100 запусков, значения time.{}.$$ уникальны лишь в 3% случаев. Хорошенькая "уникальность"! :) Под Unix картина иная, т. к. pids присваиваются по-другому, они не повторяются в течение гораздо более долгой эпохи, чем 1 сек. Тем не менее, и в Unix об уникальности time.{} (без $$) речи быть не может. А с $$ тоже могут быть нюансы, например, если дело под mod_perl, или те, о которых сказал Ян Александровский. И вообще, идея использовать для уникального идентификатора что-то детерминированное (time, {}, $$, ip address, что угодно; любая комбинация из всего этого...) -- очень наивная и плохая идея. Это сродни написанию своего генератора случайных чисел, примитивного и с кучей багов и подводных камней. -- HB mailto:npecca@yahoo.com?subject=Usenet --- ifmail v.2.15dev5 * Origin: VoronezhSvyazInform ISP (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/6307508f1599.html, оценка из 5, голосов 10
|