[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

salt = [Array.new(6){rand(256).chr}.join].pack("m").chomp

Alexandre Hudelot

7/16/2006 12:20:00 AM

This is a line taken from the "authentification" recipe in the 'Rails
Recipes' book.
I can see that it generates a string of random characters but I am
unsure of all that's going on here.

The strings that are generated have 8 characters, how come when the
array is initialized with the arg '6' ?

What exactly is .join doing here?

What does .pack("m") do?

And why the .chomp? I thought that was a func to remove newline
characters.

Thanks in advance for the help.

-Alex

--
Posted via http://www.ruby-....

4 Answers

Alexandru Popescu

7/16/2006 12:31:00 AM

0

To my understanding: creates
Array.new(6){rand(256).chr} => array of 6 random chars
array.join => string of 6 chars
[array.join] => array with 1 string of length 6
newarray.pack("m") => encode base64

and the last chomp assures that the last generated char is not a newline.

hth (even if I am not completely sure about it, and I would like to
hear from more experienced guys).

/alex
--
w( the_mindstorm )p.



On 7/16/06, Alexandre Hudelot <alexandre.hudelot@gmail.com> wrote:
> This is a line taken from the "authentification" recipe in the 'Rails
> Recipes' book.
> I can see that it generates a string of random characters but I am
> unsure of all that's going on here.
>
> The strings that are generated have 8 characters, how come when the
> array is initialized with the arg '6' ?
>
> What exactly is .join doing here?
>
> What does .pack("m") do?
>
> And why the .chomp? I thought that was a func to remove newline
> characters.
>
> Thanks in advance for the help.
>
> -Alex
>
> --
> Posted via http://www.ruby-....
>
>

Mike Stok

7/16/2006 12:40:00 AM

0


On 15-Jul-06, at 8:30 PM, Alexandru Popescu wrote:

> To my understanding: creates
> Array.new(6){rand(256).chr} => array of 6 random chars
> array.join => string of 6 chars
> [array.join] => array with 1 string of length 6
> newarray.pack("m") => encode base64
>
> and the last chomp assures that the last generated char is not a
> newline.

Close - the pack('m') always pads its result with = if necessary (to
get to a multiple of 4 characters for the encoded string) and adds a
newline. As we start with 6 characters, and base64 encoding turns
three characters into four, we end up with an 8 character string plus
a new line. The chomp deletes that newline.

In irb:

ratdog:~ mike$ irb --prompt simple
>> Array.new(6){rand(256).chr}
=> ["\332", "w", "\035", "!", "\237", "\030"]
>> ["\332", "w", "\035", "!", "\237", "\030"].join
=> "\332w\035!\237\030"
>> ["\332w\035!\237\030"].pack('m')
=> "2ncdIZ8Y\n"
>> "2ncdIZ8Y\n".chomp
=> "2ncdIZ8Y"

Mike

>
> hth (even if I am not completely sure about it, and I would like to
> hear from more experienced guys).
>
> ./alex
> --
> .w( the_mindstorm )p.
>
>
>
> On 7/16/06, Alexandre Hudelot <alexandre.hudelot@gmail.com> wrote:
>> This is a line taken from the "authentification" recipe in the 'Rails
>> Recipes' book.
>> I can see that it generates a string of random characters but I am
>> unsure of all that's going on here.
>>
>> The strings that are generated have 8 characters, how come when the
>> array is initialized with the arg '6' ?
>>
>> What exactly is .join doing here?
>>
>> What does .pack("m") do?
>>
>> And why the .chomp? I thought that was a func to remove newline
>> characters.
>>
>> Thanks in advance for the help.
>>
>> -Alex
>>
>> --
>> Posted via http://www.ruby-....
>>
>>
>
>

--

Mike Stok <mike@stok.ca>
http://www.stok...

The "`Stok' disclaimers" apply.





Alexandru Popescu

7/16/2006 8:46:00 AM

0

On 7/16/06, Mike Stok <mike@stok.ca> wrote:
>
> On 15-Jul-06, at 8:30 PM, Alexandru Popescu wrote:
>
> > To my understanding: creates
> > Array.new(6){rand(256).chr} => array of 6 random chars
> > array.join => string of 6 chars
> > [array.join] => array with 1 string of length 6
> > newarray.pack("m") => encode base64
> >
> > and the last chomp assures that the last generated char is not a
> > newline.
>
> Close - the pack('m') always pads its result with = if necessary (to
> get to a multiple of 4 characters for the encoded string) and adds a
> newline. As we start with 6 characters, and base64 encoding turns
> three characters into four, we end up with an 8 character string plus
> a new line. The chomp deletes that newline.
>

I was quite close... thanks for details Mike :-).

/alex
--
w( the_mindstorm )p.

> In irb:
>
> ratdog:~ mike$ irb --prompt simple
> >> Array.new(6){rand(256).chr}
> => ["\332", "w", "\035", "!", "\237", "\030"]
> >> ["\332", "w", "\035", "!", "\237", "\030"].join
> => "\332w\035!\237\030"
> >> ["\332w\035!\237\030"].pack('m')
> => "2ncdIZ8Y\n"
> >> "2ncdIZ8Y\n".chomp
> => "2ncdIZ8Y"
>
> Mike
>
> >
> > hth (even if I am not completely sure about it, and I would like to
> > hear from more experienced guys).
> >
> > ./alex
> > --
> > .w( the_mindstorm )p.
> >
> >
> >
> > On 7/16/06, Alexandre Hudelot <alexandre.hudelot@gmail.com> wrote:
> >> This is a line taken from the "authentification" recipe in the 'Rails
> >> Recipes' book.
> >> I can see that it generates a string of random characters but I am
> >> unsure of all that's going on here.
> >>
> >> The strings that are generated have 8 characters, how come when the
> >> array is initialized with the arg '6' ?
> >>
> >> What exactly is .join doing here?
> >>
> >> What does .pack("m") do?
> >>
> >> And why the .chomp? I thought that was a func to remove newline
> >> characters.
> >>
> >> Thanks in advance for the help.
> >>
> >> -Alex
> >>
> >> --
> >> Posted via http://www.ruby-....
> >>
> >>
> >
> >
>
> --
>
> Mike Stok <mike@stok.ca>
> http://www.stok...
>
> The "`Stok' disclaimers" apply.
>
>
>
>
>
>

Alexandre Hudelot

7/16/2006 1:04:00 PM

0

Much thanks to you two :)

--
Posted via http://www.ruby-....