XEmacs 21.2.5
[chise/xemacs-chise.git.1] / man / lispref / hash-tables.texi
1 @c -*-texinfo-*-
2 @c This is part of the XEmacs Lisp Reference Manual.
3 @c Copyright (C) 1996 Ben Wing.
4 @c See the file lispref.texi for copying conditions.
5 @setfilename ../../info/hash-tables.info
6 @node Hash Tables, Range Tables, Display, top
7 @chapter Hash Tables
8 @cindex hash table
9
10 @defun hash-table-p object
11 This function returns @code{t} if @var{object} is a hash table, else @code{nil}.
12 @end defun
13
14 @menu
15 * Introduction to Hash Tables:: Hash tables are fast data structures for
16                                 implementing simple tables (i.e. finite
17                                 mappings from keys to values).
18 * Working With Hash Tables::    Hash table functions.
19 * Weak Hash Tables::            Hash tables with special garbage-collection
20                                 behavior.
21 @end menu
22
23 @node Introduction to Hash Tables
24 @section Introduction to Hash Tables
25
26 A @dfn{hash table} is a data structure that provides mappings from
27 arbitrary Lisp objects called @dfn{keys} to other arbitrary Lisp objects
28 called @dfn{values}.  A key/value pair is sometimes called an
29 @dfn{entry} in the hash table.  There are many ways other than hash
30 tables of implementing the same sort of mapping, e.g.  association lists
31 (@pxref{Association Lists}) and property lists (@pxref{Property Lists}),
32 but hash tables provide much faster lookup when there are many entries
33 in the mapping.  Hash tables are an implementation of the abstract data
34 type @dfn{dictionary}, also known as @dfn{associative array}.
35
36 Internally, hash tables are hashed using the @dfn{linear probing} hash
37 table implementation method.  This method hashes each key to a
38 particular spot in the hash table, and then scans forward sequentially
39 until a blank entry is found.  To look up a key, hash to the appropriate
40 spot, then search forward for the key until either a key is found or a
41 blank entry stops the search.  This method is used in preference to
42 double hashing because of changes in recent hardware.  The penalty for
43 non-sequential access to memory has been increasing, and this
44 compensates for the problem of clustering that linear probing entails.
45
46 When hash tables are created, the user may (but is not required to)
47 specify initial properties that influence performance.
48
49 Use the @code{:size} parameter to specify the number of entries that are
50 likely to be stored in the hash table, to avoid the overhead of resizing
51 the table.  But if the pre-allocated space for the entries is never
52 used, it is simply wasted and makes XEmacs slower.  Excess unused hash
53 table entries exact a small continuous performance penalty, since they
54 must be scanned at every garbage collection.  If the number of entries
55 in the hash table is unknown, simply avoid using the @code{:size}
56 keyword.
57
58 Use the @code{:rehash-size} and @code{:rehash-threshold} keywords to
59 adjust the algorithm for deciding when to rehash the hash table.  For
60 temporary hash tables that are going to be very heavily used, use a
61 small rehash threshold, for example, 0.4 and a large rehash size, for
62 example 2.0.  For permanent hash tables that will be infrequently used,
63 specify a large rehash threshold, for example 0.8.
64
65 Hash tables can also be created by the lisp reader using structure
66 syntax, for example:
67 @example
68 #s(hash-table size 20 data (foo 1 bar 2))
69 @end example
70
71 The structure syntax accepts the same keywords as @code{make-hash-table}
72 (without the @code{:} character), as well as the additional keyword
73 @code{data}, which specifies the initial hash table contents.
74
75 @defun make-hash-table &key @code{:size} @code{:test} @code{:type} @code{:rehash-size} @code{:rehash-threshold}
76 This function returns a new empty hash table object.
77
78 Keyword @code{:size} specifies the number of keys likely to be inserted.
79 This number of entries can be inserted without enlarging the hash table.
80
81 Keyword @code{:test} can be @code{eq}, @code{eql} (default) or @code{equal}.
82 Comparison between keys is done using this function.
83 If speed is important, consider using @code{eq}.
84 When storing strings in the hash table, you will likely need to use @code{equal}.
85
86 Keyword @code{:type} can be @code{non-weak} (default), @code{weak},
87 @code{key-weak} or @code{value-weak}.
88
89 A weak hash table is one whose pointers do not count as GC referents:
90 for any key-value pair in the hash table, if the only remaining pointer
91 to either the key or the value is in a weak hash table, then the pair
92 will be removed from the hash table, and the key and value collected.
93 A non-weak hash table (or any other pointer) would prevent the object
94 from being collected.
95
96 A key-weak hash table is similar to a fully-weak hash table except that
97 a key-value pair will be removed only if the key remains unmarked
98 outside of weak hash tables.  The pair will remain in the hash table if
99 the key is pointed to by something other than a weak hash table, even
100 if the value is not.
101
102 A value-weak hash table is similar to a fully-weak hash table except
103 that a key-value pair will be removed only if the value remains
104 unmarked outside of weak hash tables.  The pair will remain in the
105 hash table if the value is pointed to by something other than a weak
106 hash table, even if the key is not.
107
108 Keyword @code{:rehash-size} must be a float greater than 1.0, and specifies
109 the factor by which to increase the size of the hash table when enlarging.
110
111 Keyword @code{:rehash-threshold} must be a float between 0.0 and 1.0,
112 and specifies the load factor of the hash table which triggers enlarging.
113 @end defun
114
115 @defun copy-hash-table hash-table
116 This function returns a new hash table which contains the same keys and
117 values as @var{hash-table}.  The keys and values will not themselves be
118 copied.
119 @end defun
120
121 @defun hash-table-count hash-table
122 This function returns the number of entries in @var{hash-table}.
123 @end defun
124
125 @defun hash-table-size hash-table
126 This function returns the current number of slots in @var{hash-table},
127 whether occupied or not.
128 @end defun
129
130 @defun hash-table-type hash-table
131 This function returns the type of @var{hash-table}.
132 This can be one of @code{non-weak}, @code{weak}, @code{key-weak} or
133 @code{value-weak}.
134 @end defun
135
136 @defun hash-table-test hash-table
137 This function returns the test function of @var{hash-table}.
138 This can be one of @code{eq}, @code{eql} or @code{equal}.
139 @end defun
140
141 @defun hash-table-rehash-size hash-table
142 This function returns the current rehash size of @var{hash-table}.
143 This is a float greater than 1.0; the factor by which @var{hash-table}
144 is enlarged when the rehash threshold is exceeded.
145 @end defun
146
147 @defun hash-table-rehash-threshold hash-table
148 This function returns the current rehash threshold of @var{hash-table}.
149 This is a float between 0.0 and 1.0; the maximum @dfn{load factor} of
150 @var{hash-table}, beyond which the @var{hash-table} is enlarged by rehashing.
151 @end defun
152
153 @node Working With Hash Tables
154 @section Working With Hash Tables
155
156 @defun puthash key value hash-table
157 This function hashes @var{key} to @var{value} in @var{hash-table}.
158 @end defun
159
160 @defun gethash key hash-table &optional default
161 This function finds the hash value for @var{key} in @var{hash-table}.
162 If there is no entry for @var{key} in @var{hash-table}, @var{default} is
163 returned (which in turn defaults to @code{nil}).
164 @end defun
165
166 @defun remhash key hash-table
167 This function removes the entry for @var{key} from @var{hash-table}.
168 Does nothing if there is no entry for @var{key} in @var{hash-table}.
169 @end defun
170
171 @defun clrhash hash-table
172 This function removes all entries from @var{hash-table}, leaving it empty.
173 @end defun
174
175 @defun maphash function hash-table
176 This function maps @var{function} over entries in @var{hash-table},
177 calling it with two args, each key and value in the hash table.
178
179 @var{function} may not modify @var{hash-table}, with the one exception
180 that @var{function} may remhash or puthash the entry currently being
181 processed by @var{function}.
182 @end defun
183
184 @node Weak Hash Tables
185 @section Weak Hash Tables
186 @cindex hash table, weak
187 @cindex weak hash table
188
189 A @dfn{weak hash table} is a special variety of hash table whose
190 elements do not count as GC referents.  For any key-value pair in such a
191 hash table, if either the key or value (or in some cases, if one
192 particular one of the two) has no references to it outside of weak hash
193 tables (and similar structures such as weak lists), the pair will be
194 removed from the table, and the key and value collected.  A non-weak
195 hash table (or any other pointer) would prevent the objects from being
196 collected.
197
198 Weak hash tables are useful for keeping track of information in a
199 non-obtrusive way, for example to implement caching.  If the cache
200 contains objects such as buffers, markers, image instances, etc. that
201 will eventually disappear and get garbage-collected, using a weak hash
202 table ensures that these objects are collected normally rather than
203 remaining around forever, long past their actual period of use.
204 (Otherwise, you'd have to explicitly map over the hash table every so
205 often and remove unnecessary elements.)
206
207 There are three types of weak hash tables:
208
209 @table @asis
210 @item fully weak hash tables
211 In these hash tables, a pair disappears if either the key or the value
212 is unreferenced outside of the table.
213 @item key-weak hash tables
214 In these hash tables, a pair disappears if the key is unreferenced outside
215 of the table, regardless of how the value is referenced.
216 @item value-weak hash tables
217 In these hash tables, a pair disappears if the value is unreferenced outside
218 of the table, regardless of how the key is referenced.
219 @end table
220
221 Also see @ref{Weak Lists}.
222
223 Weak hash tables are created by specifying the @code{:type} keyword to
224 @code{make-hash-table}.