A Hash is a collection of key-value
pairs. It is similar to an Array, except
that indexing is done via arbitrary keys of
any object type, not an integer index. The
order in which you traverse a hash by either
key or value may seem arbitrary, and will generally not be in the insertion
order.

Hashes have a default value that
is returned when accessing keys that do not
exist in the hash. By default, that value is
nil.

Hash uses key.eql? to test keys for equality. If you need to use instances
of your own classes as keys in a Hash, it is recommended that you define both the
eql? and hash methods. The hash method must have the property that
a.eql?(b) implies a.hash == b.hash.

I find trully useful this. Is a kind of generalized zip. You can combine 2
or more enumerables (arrays or others) of any size into a hash, array of arrays, .… The size of the result is the size of the bigest of the enumerables. For the
shortests enumerables nil elements are used at the end.