3.10 Hash Tables
A hash table implements a mapping from keys to values, where
both keys and values can be arbitrary Racket values, and access and
update to the table are normally constant-time operations. Keys are
compared using equal?, eqv?, or eq?, depending on whether
the hash table is created with make-hash,
make-hasheqv, or make-hasheq.
Examples:
The hash, hasheqv, and hasheq functions
create immutable hash tables from an initial set of keys and values,
in which each value is provided as an argument after its key. Immutable
hash tables can be extended with hash-set, which produces a
new immutable hash table in constant time.
Examples:
A literal immutable hash table can be written as an expression by using
#hash (for an equal?-based table),
#hasheqv (for an eqv?-based table), or
#hasheq (for an eq?-based table). A parenthesized
sequence must immediately follow #hash, #hasheq,
or #hasheqv, where each element is a dotted
key–value pair. The #hash, etc. forms implicitly
quote their key and value sub-forms.
Examples:
> (define ht #hash(("apple" . red) | ("banana" . yellow))) |
|
|
> (hash-ref ht "apple") |
'red |
Reading Hash Tables in The Racket Reference documents the fine points of the syntax of hash table literals.
Both mutable and immutable hash tables print like immutable hash
tables, using a quoted #hash, #hasheqv, or
#hasheq form if all keys and values can be expressed with
quote or using hash, hasheq, or
hasheqv otherwise:
Examples:
> #hash(("apple" . red) | ("banana" . yellow)) |
|
'#hash(("apple" . red) ("banana" . yellow)) |
> (hash 1 (srcloc "file.rkt" 1 0 1 (+ 4 4))) |
(hash 1 (srcloc "file.rkt" 1 0 1 8)) |
A mutable hash table can optionally retain its keys
weakly, so each mapping is retained only so long as the key
is retained elsewhere.
Examples:
Beware that even a weak hash table retains its values strongly, as
long as the corresponding key is accessible. This creates a catch-22
dependency when a value refers back to its key, so that the mapping is
retained permanently. To break the cycle, map the key to an ephemeron
that pairs the value with its key (in addition to the implicit pairing
of the hash table).
Ephemerons in The Racket Reference documents the fine points of using ephemerons.
Examples:
Hash Tables in The Racket Reference provides more on hash tables and hash-table procedures.