On 17 May 2016 at 20:23, demerphq <demer...@gmail.com> wrote:
> On 16 May 2016 at 20:03, Bruce  Johnson <john...@pharmacy.arizona.edu> wrote:
>>
>>> On May 16, 2016, at 10:15 AM, André Warnier (tomcat) <a...@ice-sa.com> 
>>> wrote:
>>>
>>>
>>> join "", map +(0..9,"a".."z","A".."Z")[rand(10+26*2)], 1..32 ;
>>>
>>> looks at first sight to me like quite inefficient and probably likely to 
>>> generate the same string regularly, even if it does not look that way.
>>> (The only variable there is rand(), and it can only return values between 0 
>>> and 62).
>>
>> The  function is meant to map a random element from the 62-element-long  
>> array (0..9,"a".."z","A".."Z”) (hence a rand() call to generate a number 
>> from 0 and 62), 32 times, and join them into a string.
>>
>> Although I think that should really be rand(9+26*2) to properly generate 
>> array indices for the entire array and no more. With a number between 0 and 
>> 62 (63 numbers) and a 62-element array, you’ll be retrieving nulls from the 
>> array 1/62 calls,  but all that means is that the string is one char shorter 
>> for each time '62’ comes up...
>>
>> So long as rand is properly seeded, you should not get repeats, at least not 
>> frequently enough to ever notice, I’d think.
>>
>> This is textbook Perl, as in I’m pretty sure it’s out of one of Larry Wall’s 
>> books; I use it to generate random strings for cookies.
>>
>> If it’s properly seeded in the original code, it should either work or not 
>> work on all five servers. Not working on one out of the five makes me think 
>> maybe there’s some sort of weird caching issue.
>
> Or for some reason one of the servers goes through a code path where
> it calls srand/rand prefork.
>
> An unfortunate side effect of the rules of srand in perl is that if
> you fork without calling rand each child process will have their own
> seed. if you rand before fork then all the children will have their
> own seed.

Sorry, that should read "if you rand before fork then all the children
will SHARE THE SAME SEED".

I personally consider this a bug in Perl, but I doubt it will get fixed.

Yves


-- 
perl -Mre=debug -e "/just|another|perl|hacker/"

Reply via email to