Beefy Boxes and Bandwidth Generously Provided by pair Networks Cowboy Neal with Hat
P is for Practical
 
PerlMonks  

Scalar to a hash, what is that?

by tradez (Pilgrim)
on Jan 28, 2003 at 18:25 UTC ( #230678=perlquestion: print w/ replies, xml ) Need Help??
tradez has asked for the wisdom of the Perl Monks concerning the following question:

My fellow Monks, I know perl has many interesting and intuitive ways to figure out what you want by assigning a scaler to say an array:
@array = ('1', '2', '3'); $test = @array; print $test; 3
But what the heck does it mean when I assign a scalar to a hash and I get like 9/16 for the value? Please inform me cause this is completely illogical to me for some reason.

Tradez
"Never underestimate the predicability of stupidity"
- Bullet Tooth Tony, Snatch (2001)

Comment on Scalar to a hash, what is that?
Download Code
Re: Scalar to a hash, what is that?
by dempa (Friar) on Jan 28, 2003 at 18:34 UTC

    From perldata:

    If you evaluate a hash in scalar context, it returns false
    if the hash is empty.  If there are any key/value pairs,
    it returns true; more precisely, the value returned is a
    string consisting of the number of used buckets and the
    number of allocated buckets, separated by a slash.  This
    is pretty much useful only to find out whether Perl's
    internal hashing algorithm is performing poorly on your
    data set.  For example, you stick 10,000 things in a hash,
    but evaluating %HASH in scalar context reveals "1/16",
    which means only one out of sixteen buckets has been
    touched, and presumably contains all 10,000 of your items.
    This isn't supposed to happen.

    I'm sure there's more that can be said about Perl's internal hashing algorithm, but perhaps someone else could fill that in because the internals of Perl are not my strong side.

    -- 
    dempa

      Background on how hashing works:

      A hash consists of a set of 'buckets' that can hold zero or more values. To decide which bucket to put your data value in a hash function is used to transform your string key into an IV. This is then used to pick which bucket (probably using hash % @buckets, but I'm not sure on perl specifics), to place the datum in. The value perl returns consists of two parts. The first is the number of buckets that have been used, and the second is the total number of buckets.

      As perldata says you can use this as a metric to see how well perl is hashing your data. Ideally the hash should spread your keys out evenly across the buckets. In the real world the hashing function has to work well for lots of different types of keys. If you see a low utilisation of the buckets this indicates a problem of this kind.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://230678]
Approved by Mr. Muskrat
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (4)
As of 2014-04-19 18:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (483 votes), past polls