| [reply] |
As it was my explanation in chatter that inspired this
obfuscation, here is a quick explanation.
A hashing function is a function that takes input (usually
a string) and gives back a number in some range.
A hash lookup algorithm takes keys, passes the keys to a
hashing function, and then uses that number to select a
bucket, then stores the key/value in the bucket in some
way. Hopefully the keys are pretty much randomly
distributed so each bucket has few things in it. Details
vary, there are different hashing algorithms you can use,
different ways to store things in buckets, often there is
some dynamic decision on how many buckets to use, etc.
Perl's hashes are called hashes because they use a hash
lookup algorithm to store data. That is why lookups are
fast. But when you ask for them back (with keys
or values) it just walks the buckets, and returns
things out of the buckets. The order you get back
depends on all sorts of things, starting with the hashing
function and number of buckets...
As a test, anyone who can understand Re: Re: Shift, Pop, Unshift and Push with Impunity!
probably understood this explanation perfectly.
Anyways, the order that stuff comes back is entirely
determined by internal details, looks random, but isn't.
So if you figure out what order keys will give for (for
instance) a series of numbers, then just put the values
in matched to where you want them to go and voila! You
get output sorted from values just right for no apparent
reason! :-)
| [reply] |
Hash keys are not stored in order. They are stored by the fastest way to retrive the keys/values. If you want to know the exact reason why it is in that order, you will either need to look at the perl source code and figure it out, or talk with someone that <bold>REALLY</bold> knows the internals of perl. Also, you will notice that order is different in different versions of perl.
| [reply] |
I think it's got something to do with the order in which Perl stores hash keys.
| [reply] |