Hash-tables.xhtml 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:pls="http://www.w3.org/2005/01/pronunciation-lexicon" xmlns:ssml="http://www.w3.org/2001/10/synthesis" xmlns:svg="http://www.w3.org/2000/svg">
  3. <head>
  4. <title>Hash tables</title>
  5. <link rel="stylesheet" type="text/css" href="docbook-epub.css"/>
  6. <link rel="stylesheet" type="text/css" href="kawa.css"/>
  7. <script src="kawa-ebook.js" type="text/javascript"/>
  8. <meta name="generator" content="DocBook XSL-NS Stylesheets V1.79.1"/>
  9. <link rel="prev" href="Overall-Index.xhtml" title="Index"/>
  10. <link rel="next" href="Eval-and-Environments.xhtml" title="Eval and Environments"/>
  11. </head>
  12. <body>
  13. <header/>
  14. <section class="sect1" title="Hash tables" epub:type="subchapter" id="Hash-tables">
  15. <div class="titlepage">
  16. <div>
  17. <div>
  18. <h2 class="title" style="clear: both">Hash tables</h2>
  19. </div>
  20. </div>
  21. </div>
  22. <p>A <em class="firstterm">hashtable</em> is a data structure that
  23. associates keys with values.
  24. The hashtable has no intrinsic order for the (key, value) associations
  25. it contains, and
  26. supports in-place modification as the primary means of setting the contents
  27. of a hash table.
  28. Any object can be used as a key, provided a <em class="firstterm">hash function</em> and a suitable
  29. <em class="firstterm">equivalence function</em> is available.
  30. A hash function is a procedure that
  31. maps keys to exact integer objects.
  32. </p>
  33. <p>The hashtable provides key lookup and destructive update in amortised
  34. constant time, provided that a good hash function is used.
  35. A hash function <em class="replaceable"><code>h</code></em> is acceptable for an equivalence predicate <em class="replaceable"><code>e</code></em> iff
  36. <code class="literal">(<em class="replaceable"><code>e</code></em> <em class="replaceable"><code>obj1</code></em> <em class="replaceable"><code>obj2</code></em>)</code> implies
  37. <code class="literal">(= (<em class="replaceable"><code>h</code></em> <em class="replaceable"><code>obj1</code></em>) (<em class="replaceable"><code>h</code></em> <em class="replaceable"><code>obj2</code></em>))</code>.
  38. A hash function <em class="replaceable"><code>h</code></em> is good for a equivalence predicate <em class="replaceable"><code>e</code></em> if
  39. it distributes the resulting hash values for non-equal objects
  40. (by <em class="replaceable"><code>e</code></em>) as uniformly as possible over the range of hash
  41. values, especially in the case when some (non-equal) objects resemble
  42. each other by e.g. having common subsequences. This definition is
  43. vague but should be enough to assert that e.g. a constant function is
  44. not a good hash function.
  45. </p>
  46. <p>Kawa provides two complete sets of functions for hashtables:
  47. </p>
  48. <div class="itemizedlist" epub:type="list">
  49. <ul class="itemizedlist" style="list-style-type: disc; ">
  50. <li class="listitem" epub:type="list-item">
  51. <p>The functions specified by R6RS have names starting with <code class="literal">hashtable-</code>
  52. </p>
  53. </li>
  54. <li class="listitem" epub:type="list-item">
  55. <p>The functions specified by the older
  56. <a class="ulink" href="http://srfi.schemers.org/srfi-69/srfi-69.html" target="_top">SRFI-69</a> specifiation
  57. have names starting with <code class="literal">hash-table-</code>
  58. </p>
  59. </li>
  60. </ul>
  61. </div>
  62. <p>Both interfaces use the same underlying datatype, so it is possible
  63. to mix and match from both sets.
  64. That datatype implements <code class="literal">java.util.Map</code>.
  65. Freshly-written code should probably use the R6RS functions.
  66. </p>
  67. <section class="sect2" title="R6RS hash tables" epub:type="division" id="idm139667873522768">
  68. <div class="titlepage">
  69. <div>
  70. <div>
  71. <h3 class="title">R6RS hash tables</h3>
  72. </div>
  73. </div>
  74. </div>
  75. <p>To use these hash table functions in your Kawa program you must first:
  76. </p>
  77. <pre class="screen">(import (rnrs hashtables))
  78. </pre>
  79. <p>This section uses the <em class="replaceable"><code>hashtable</code></em> parameter name for arguments that
  80. must be hashtables, and the <em class="replaceable"><code>key</code></em> parameter name for arguments that
  81. must be hashtable keys.
  82. </p>
  83. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873519424" class="indexterm"/> <code class="function">make-eq-hashtable</code></p>
  84. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873517008" class="indexterm"/> <code class="function">make-eq-hashtable</code> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  85. <div class="blockquote">
  86. <blockquote class="blockquote">
  87. <p>Return a newly allocated mutable hashtable that accepts arbitrary
  88. objects as keys, and compares those keys with <code class="literal">eq?</code>. If an
  89. argument is given, the initial capacity of the hashtable is set to
  90. approximately <em class="replaceable"><code>k</code></em> elements.
  91. </p>
  92. </blockquote>
  93. </div>
  94. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873512528" class="indexterm"/> <code class="function">make-eqv-hashtable</code></p>
  95. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873510112" class="indexterm"/> <code class="function">make-eqv-hashtable</code> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  96. <div class="blockquote">
  97. <blockquote class="blockquote">
  98. <p>Return a newly allocated mutable hashtable that accepts arbitrary
  99. objects as keys, and compares those keys with <code class="literal">eqv?</code>. If an
  100. argument is given, the initial capacity of the hashtable is set to
  101. approximately <em class="replaceable"><code>k</code></em> elements.
  102. </p>
  103. </blockquote>
  104. </div>
  105. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873505600" class="indexterm"/> <code class="function">make-hashtable</code> <em class="replaceable"><code><em class="replaceable"><code>hash-function</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>equiv</code></em></code></em></p>
  106. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873502096" class="indexterm"/> <code class="function">make-hashtable</code> <em class="replaceable"><code><em class="replaceable"><code>hash-function</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>equiv</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  107. <div class="blockquote">
  108. <blockquote class="blockquote">
  109. <p><em class="replaceable"><code>hash-function</code></em> and <em class="replaceable"><code>equiv</code></em> must be procedures.
  110. <em class="replaceable"><code>hash-function</code></em> should accept a key as an argument and should return
  111. a non–negative exact integer object. <em class="replaceable"><code>equiv</code></em> should accept two
  112. keys as arguments and return a single value. Neither procedure should
  113. mutate the hashtable returned by <code class="literal">make-hashtable</code>.
  114. </p>
  115. <p>The <code class="literal">make-hashtable</code> procedure returns a newly allocated mutable
  116. hashtable using <em class="replaceable"><code>hash-function</code></em> as the hash function and <em class="replaceable"><code>equiv</code></em>
  117. as the equivalence function used to compare keys. If a third argument
  118. is given, the initial capacity of the hashtable is set to approximately
  119. <em class="replaceable"><code>k</code></em> elements.
  120. </p>
  121. <p>Both <em class="replaceable"><code>hash-function</code></em> and <em class="replaceable"><code>equiv</code></em> should behave like pure
  122. functions on the domain of keys. For example, the <code class="literal">string-hash</code>
  123. and <code class="literal">string=?</code> procedures are permissible only if all keys are
  124. strings and the contents of those strings are never changed so long as
  125. any of them continues to serve as a key in the hashtable. Furthermore,
  126. any pair of keys for which <em class="replaceable"><code>equiv</code></em> returns true should be hashed to
  127. the same exact integer objects by <em class="replaceable"><code>hash-function</code></em>.
  128. </p>
  129. <div class="blockquote">
  130. <blockquote class="blockquote">
  131. <p><span class="emphasis"><em>Note:</em></span> Hashtables are allowed to cache the results of calling the
  132. hash function and equivalence function, so programs cannot rely on the
  133. hash function being called for every lookup or update. Furthermore any
  134. hashtable operation may call the hash function more than once.
  135. </p>
  136. </blockquote>
  137. </div>
  138. </blockquote>
  139. </div>
  140. <section class="sect3" title="Procedures" epub:type="division" id="idm139667873488544">
  141. <div class="titlepage">
  142. <div>
  143. <div>
  144. <h4 class="title">Procedures</h4>
  145. </div>
  146. </div>
  147. </div>
  148. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873487472" class="indexterm"/> <code class="function">hashtable?</code> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em></p>
  149. <div class="blockquote">
  150. <blockquote class="blockquote">
  151. <p>Return <code class="literal">#t</code> if <em class="replaceable"><code>obj</code></em> is a hashtable, <code class="literal">#f</code> otherwise.
  152. </p>
  153. </blockquote>
  154. </div>
  155. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873482752" class="indexterm"/> <code class="function">hashtable-size</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  156. <div class="blockquote">
  157. <blockquote class="blockquote">
  158. <p>Return the number of keys contained in <em class="replaceable"><code>hashtable</code></em> as an exact
  159. integer object.
  160. </p>
  161. </blockquote>
  162. </div>
  163. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873478768" class="indexterm"/> <code class="function">hashtable-ref</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>key</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>default</code></em></code></em></p>
  164. <div class="blockquote">
  165. <blockquote class="blockquote">
  166. <p>Return the value in <em class="replaceable"><code>hashtable</code></em> associated with <em class="replaceable"><code>key</code></em>. If
  167. <em class="replaceable"><code>hashtable</code></em> does not contain an association for <em class="replaceable"><code>key</code></em>,
  168. <em class="replaceable"><code>default</code></em> is returned.
  169. </p>
  170. </blockquote>
  171. </div>
  172. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873472048" class="indexterm"/> <code class="function">hashtable-set!</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>key</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em></p>
  173. <div class="blockquote">
  174. <blockquote class="blockquote">
  175. <p>Change <em class="replaceable"><code>hashtable</code></em> to associate <em class="replaceable"><code>key</code></em> with <em class="replaceable"><code>obj</code></em>, adding a
  176. new association or replacing any existing association for <em class="replaceable"><code>key</code></em>, and
  177. returns unspecified values.
  178. </p>
  179. </blockquote>
  180. </div>
  181. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873465760" class="indexterm"/> <code class="function">hashtable-delete!</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>key</code></em></code></em></p>
  182. <div class="blockquote">
  183. <blockquote class="blockquote">
  184. <p>Remove any association for <em class="replaceable"><code>key</code></em> within <em class="replaceable"><code>hashtable</code></em> and returns
  185. unspecified values.
  186. </p>
  187. </blockquote>
  188. </div>
  189. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873460848" class="indexterm"/> <code class="function">hashtable-contains?</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>key</code></em></code></em></p>
  190. <div class="blockquote">
  191. <blockquote class="blockquote">
  192. <p>Return <code class="literal">#t</code> if <em class="replaceable"><code>hashtable</code></em> contains an association for <em class="replaceable"><code>key</code></em>,
  193. <code class="literal">#f</code> otherwise.
  194. </p>
  195. </blockquote>
  196. </div>
  197. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873455152" class="indexterm"/> <code class="function">hashtable-update!</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>key</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>proc</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>default</code></em></code></em></p>
  198. <div class="blockquote">
  199. <blockquote class="blockquote">
  200. <p><em class="replaceable"><code>proc</code></em> should accept one argument, should return a single value, and
  201. should not mutate <em class="replaceable"><code>hashtable</code></em>.
  202. </p>
  203. <p>The <code class="literal">hashtable-update!</code> procedure applies <em class="replaceable"><code>proc</code></em> to the value
  204. in <em class="replaceable"><code>hashtable</code></em> associated with <em class="replaceable"><code>key</code></em>, or to <em class="replaceable"><code>default</code></em> if
  205. <em class="replaceable"><code>hashtable</code></em> does not contain an association for <em class="replaceable"><code>key</code></em>. The
  206. <em class="replaceable"><code>hashtable</code></em> is then changed to associate <em class="replaceable"><code>key</code></em> with the value
  207. returned by <em class="replaceable"><code>proc</code></em>.
  208. </p>
  209. <p>The behavior of <code class="literal">hashtable-update!</code> is equivalent to the following
  210. code, but is may be (and is in Kawa) implemented more efficiently in cases
  211. where the implementation can avoid multiple lookups of the same key:
  212. </p>
  213. <pre class="screen">(hashtable-set!
  214. hashtable key
  215. (proc (hashtable-ref
  216. hashtable key default)))
  217. </pre>
  218. </blockquote>
  219. </div>
  220. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873442944" class="indexterm"/> <code class="function">hashtable-copy</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  221. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873439984" class="indexterm"/> <code class="function">hashtable-copy</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>mutable</code></em></code></em></p>
  222. <div class="blockquote">
  223. <blockquote class="blockquote">
  224. <p>Return a copy of <em class="replaceable"><code>hashtable</code></em>. If the <em class="replaceable"><code>mutable</code></em> argument is
  225. provided and is true, the returned hashtable is mutable; otherwise it is
  226. immutable.
  227. </p>
  228. </blockquote>
  229. </div>
  230. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873434960" class="indexterm"/> <code class="function">hashtable-clear!</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  231. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873432000" class="indexterm"/> <code class="function">hashtable-clear!</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em> <em class="replaceable"><code><em class="replaceable"><code>k</code></em></code></em></p>
  232. <div class="blockquote">
  233. <blockquote class="blockquote">
  234. <p>Remove all associations from <em class="replaceable"><code>hashtable</code></em> and returns unspecified
  235. values.
  236. </p>
  237. <p>If a second argument is given, the current capacity of the hashtable is
  238. reset to approximately <em class="replaceable"><code>k</code></em> elements.
  239. </p>
  240. </blockquote>
  241. </div>
  242. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873426592" class="indexterm"/> <code class="function">hashtable-keys</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  243. <div class="blockquote">
  244. <blockquote class="blockquote">
  245. <p>Return a vector of all keys in <em class="replaceable"><code>hashtable</code></em>. The order of the vector
  246. is unspecified.
  247. </p>
  248. </blockquote>
  249. </div>
  250. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873422656" class="indexterm"/> <code class="function">hashtable-entries</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  251. <div class="blockquote">
  252. <blockquote class="blockquote">
  253. <p>Return two values, a vector of the keys in <em class="replaceable"><code>hashtable</code></em>, and a vector
  254. of the corresponding values.
  255. </p>
  256. <p>Example:
  257. </p>
  258. <pre class="screen">(let ((h (make-eqv-hashtable)))
  259. (hashtable-set! h 1 'one)
  260. (hashtable-set! h 2 'two)
  261. (hashtable-set! h 3 'three)
  262. (hashtable-entries h))
  263. ⇒ #(1 2 3) #(one two three) ; two return values
  264. </pre>
  265. <p>the order of the entries in the result vectors is not known.
  266. </p>
  267. </blockquote>
  268. </div>
  269. </section>
  270. <section class="sect3" title="Inspection" epub:type="division" id="idm139667873417072">
  271. <div class="titlepage">
  272. <div>
  273. <div>
  274. <h4 class="title">Inspection</h4>
  275. </div>
  276. </div>
  277. </div>
  278. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873416000" class="indexterm"/> <code class="function">hashtable-equivalence-function</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  279. <div class="blockquote">
  280. <blockquote class="blockquote">
  281. <p>Return the equivalence function used by <em class="replaceable"><code>hashtable</code></em> to compare keys.
  282. For hashtables created with <code class="literal">make-eq-hashtable</code> and
  283. <code class="literal">make-eqv-hashtable</code>, returns <code class="literal">eq?</code> and <code class="literal">eqv?</code>
  284. respectively.
  285. </p>
  286. </blockquote>
  287. </div>
  288. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873410192" class="indexterm"/> <code class="function">hashtable-hash-function</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  289. <div class="blockquote">
  290. <blockquote class="blockquote">
  291. <p>Return the hash function used by <em class="replaceable"><code>hashtable</code></em>. For hashtables
  292. created by <code class="literal">make-eq-hashtable</code> or <code class="literal">make-eqv-hashtable</code>,
  293. <code class="literal">#f</code> is returned.
  294. </p>
  295. </blockquote>
  296. </div>
  297. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873404928" class="indexterm"/> <code class="function">hashtable-mutable?</code> <em class="replaceable"><code><em class="replaceable"><code>hashtable</code></em></code></em></p>
  298. <div class="blockquote">
  299. <blockquote class="blockquote">
  300. <p>Return <code class="literal">#t</code> if <em class="replaceable"><code>hashtable</code></em> is mutable, otherwise <code class="literal">#f</code>.
  301. </p>
  302. </blockquote>
  303. </div>
  304. </section>
  305. <section class="sect3" title="Hash functions" epub:type="division" id="idm139667873400176">
  306. <div class="titlepage">
  307. <div>
  308. <div>
  309. <h4 class="title">Hash functions</h4>
  310. </div>
  311. </div>
  312. </div>
  313. <p>The <code class="literal">equal-hash</code>, <code class="literal">string-hash</code>, and <code class="literal">string-ci-hash</code>
  314. procedures of this section are acceptable as the hash functions of a
  315. hashtable only if the keys on which they are called are not mutated
  316. while they remain in use as keys in the hashtable.
  317. </p>
  318. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873397200" class="indexterm"/> <code class="function">equal-hash</code> <em class="replaceable"><code><em class="replaceable"><code>obj</code></em></code></em></p>
  319. <div class="blockquote">
  320. <blockquote class="blockquote">
  321. <p>Return an integer hash value for <em class="replaceable"><code>obj</code></em>, based on its structure and
  322. current contents. This hash function is suitable for use with
  323. <code class="literal">equal?</code> as an equivalence function.
  324. </p>
  325. <div class="blockquote">
  326. <blockquote class="blockquote">
  327. <p><span class="emphasis"><em>Note:</em></span> Like <code class="literal">equal?</code>, the <code class="literal">equal-hash</code> procedure must
  328. always terminate, even if its arguments contain cycles.
  329. </p>
  330. </blockquote>
  331. </div>
  332. </blockquote>
  333. </div>
  334. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873391088" class="indexterm"/> <code class="function">string-hash</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  335. <div class="blockquote">
  336. <blockquote class="blockquote">
  337. <p>Return an integer hash value for <em class="replaceable"><code>string</code></em>, based on its current
  338. contents. This hash function is suitable for use with <code class="literal">string=?</code>
  339. as an equivalence function.
  340. </p>
  341. </blockquote>
  342. </div>
  343. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873386592" class="indexterm"/> <code class="function">string-ci-hash</code> <em class="replaceable"><code><em class="replaceable"><code>string</code></em></code></em></p>
  344. <div class="blockquote">
  345. <blockquote class="blockquote">
  346. <p>Return an integer hash value for <em class="replaceable"><code>string</code></em> based on its current
  347. contents, ignoring case. This hash function is suitable for use with
  348. <code class="literal">string-ci=?</code> as an equivalence function.
  349. </p>
  350. </blockquote>
  351. </div>
  352. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873382080" class="indexterm"/> <code class="function">symbol-hash</code> <em class="replaceable"><code><em class="replaceable"><code>symbol</code></em></code></em></p>
  353. <div class="blockquote">
  354. <blockquote class="blockquote">
  355. <p>Return an integer hash value for <em class="replaceable"><code>symbol</code></em>.
  356. </p>
  357. </blockquote>
  358. </div>
  359. </section>
  360. </section>
  361. <section class="sect2" title="SRFI-69 hash tables" epub:type="division" id="idm139667873378016">
  362. <div class="titlepage">
  363. <div>
  364. <div>
  365. <h3 class="title">SRFI-69 hash tables</h3>
  366. </div>
  367. </div>
  368. </div>
  369. <p>To use these hash table functions in your Kawa program you must first:
  370. </p>
  371. <pre class="screen">(require 'srfi-69)
  372. </pre>
  373. <p>or
  374. </p>
  375. <pre class="screen">(require 'hash-table)
  376. </pre>
  377. <p>or
  378. </p>
  379. <pre class="screen">(import (srfi 69 basic-hash-tables))
  380. </pre>
  381. <section class="sect3" title="Type constructors and predicate" epub:type="division" id="idm139667873375216">
  382. <div class="titlepage">
  383. <div>
  384. <div>
  385. <h4 class="title">Type constructors and predicate</h4>
  386. </div>
  387. </div>
  388. </div>
  389. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873374128" class="indexterm"/> <code class="function">make-hash-table</code> [ <em class="replaceable"><code>equal?</code></em> [ <em class="replaceable"><code>hash</code></em> [ <em class="replaceable"><code>size-hint</code></em>]]] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>hash-table</code></em></p>
  390. <div class="blockquote">
  391. <blockquote class="blockquote">
  392. <p>Create a new hash table with no associations.
  393. The <em class="replaceable"><code>equal?</code></em> parameter is a predicate
  394. that should accept two keys and return a boolean telling whether they
  395. denote the same key value; it defaults to the <code class="literal">equal?</code> function.
  396. </p>
  397. <p>The <em class="replaceable"><code>hash</code></em> parameter is a hash function, and defaults to an
  398. appropriate hash function
  399. for the given <em class="replaceable"><code>equal?</code></em> predicate (see the Hashing section).
  400. However, an
  401. acceptable default is not guaranteed to be given for any equivalence
  402. predicate coarser than <code class="literal">equal?</code>, except for <code class="literal">string-ci=?</code>.
  403. (The function <code class="literal">hash</code> is acceptable for <code class="literal">equal?</code>, so if you
  404. use coarser equivalence than <code class="literal">equal?</code> other than <code class="literal">string-ci=?</code>,
  405. you must always provide the function hash yourself.)
  406. (An equivalence predicate <em class="replaceable"><code>c1</code></em> is coarser than a equivalence
  407. predicate <em class="replaceable"><code>c2</code></em> iff there exist values <em class="replaceable"><code>x</code></em> and <em class="replaceable"><code>y</code></em> such
  408. that <code class="literal">(and (<em class="replaceable"><code>c1</code></em> <em class="replaceable"><code>x</code></em> <em class="replaceable"><code>y</code></em>) (not (<em class="replaceable"><code>c2</code></em> <em class="replaceable"><code>x</code></em> <em class="replaceable"><code>y</code></em>)))</code>.)
  409. </p>
  410. <p>The <em class="replaceable"><code>size-hint</code></em> parameter can be used to suggested an approriate
  411. initial size. This option is not part of the SRFI-69 specification
  412. (though it is handled by the reference implementation), so specifying
  413. that option might be unportable.
  414. </p>
  415. </blockquote>
  416. </div>
  417. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873357984" class="indexterm"/> <code class="function">hash-table?</code> <em class="replaceable"><code>obj</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>boolean</code></em></p>
  418. <div class="blockquote">
  419. <blockquote class="blockquote">
  420. <p>A predicate to test whether a given object <em class="replaceable"><code>obj</code></em> is a hash table.
  421. </p>
  422. </blockquote>
  423. </div>
  424. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873353360" class="indexterm"/> <code class="function">alist-&gt;hash-table</code> <em class="replaceable"><code>alist</code></em> [ <em class="replaceable"><code>equal?</code></em> [ <em class="replaceable"><code>hash</code></em> [ <em class="replaceable"><code>size-hint</code></em>]]] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>hash-table</code></em></p>
  425. <div class="blockquote">
  426. <blockquote class="blockquote">
  427. <p>Takes an association list <em class="replaceable"><code>alist</code></em> and creates a hash table
  428. <em class="replaceable"><code>hash-table</code></em> which maps the <code class="literal">car</code> of every element in
  429. <em class="replaceable"><code>alist</code></em> to the <code class="literal">cdr</code> of corresponding elements in
  430. <em class="replaceable"><code>alist</code></em>. The <em class="replaceable"><code>equal?</code></em>, <em class="replaceable"><code>hash</code></em>, and <em class="replaceable"><code>size-hint</code></em>
  431. parameters are interpreted as in <code class="literal">make-hash-table</code>. If some key
  432. occurs multiple times in <em class="replaceable"><code>alist</code></em>, the value in the first
  433. association will take precedence over later ones. (Note: the choice of
  434. using <code class="literal">cdr</code> (instead of <code class="literal">cadr</code>) for values tries to strike
  435. balance between the two approaches: using <em class="replaceable"><code>cadr</code></em> would render this
  436. procedure unusable for <code class="literal">cdr</code> alists, but not vice versa.)
  437. </p>
  438. </blockquote>
  439. </div>
  440. </section>
  441. <section class="sect3" title="Reflective queries" epub:type="division" id="idm139667873340864">
  442. <div class="titlepage">
  443. <div>
  444. <div>
  445. <h4 class="title">Reflective queries</h4>
  446. </div>
  447. </div>
  448. </div>
  449. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873339792" class="indexterm"/> <code class="function">hash-table-equivalence-function</code> <em class="replaceable"><code>hash-table</code></em></p>
  450. <div class="blockquote">
  451. <blockquote class="blockquote">
  452. <p>Returns the equivalence predicate used for keys of <em class="replaceable"><code>hash-table</code></em>.
  453. </p>
  454. </blockquote>
  455. </div>
  456. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873335936" class="indexterm"/> <code class="function">hash-table-hash-function</code> <em class="replaceable"><code>hash-table</code></em></p>
  457. <div class="blockquote">
  458. <blockquote class="blockquote">
  459. <p>Returns the hash function used for keys of <em class="replaceable"><code>hash-table</code></em>.
  460. </p>
  461. </blockquote>
  462. </div>
  463. </section>
  464. <section class="sect3" title="Dealing with single elements" epub:type="division" id="idm139667873332080">
  465. <div class="titlepage">
  466. <div>
  467. <div>
  468. <h4 class="title">Dealing with single elements</h4>
  469. </div>
  470. </div>
  471. </div>
  472. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873330992" class="indexterm"/> <code class="function">hash-table-ref</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> [ <em class="replaceable"><code>thunk</code></em> ] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>value</code></em></p>
  473. <div class="blockquote">
  474. <blockquote class="blockquote">
  475. <p>This procedure returns the value associated to <em class="replaceable"><code>key</code></em> in
  476. <em class="replaceable"><code>hash-table</code></em>. If no value is associated to <em class="replaceable"><code>key</code></em> and
  477. <em class="replaceable"><code>thunk</code></em> is given, it is called with no arguments and its value is
  478. returned; if <em class="replaceable"><code>thunk</code></em> is not given, an error is signalled. Given a
  479. good hash function, this operation should have an (amortised) complexity
  480. of O(1) with respect to the number of associations in <em class="replaceable"><code>hash-table</code></em>.
  481. </p>
  482. </blockquote>
  483. </div>
  484. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873323072" class="indexterm"/> <code class="function">hash-table-ref/default</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>default</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>value</code></em></p>
  485. <div class="blockquote">
  486. <blockquote class="blockquote">
  487. <p>Evaluates to the same value as <code class="literal">(hash-table-ref <em class="replaceable"><code>hash-table</code></em>
  488. <em class="replaceable"><code>key</code></em> (lambda () <em class="replaceable"><code>default</code></em>))</code>. Given a good hash function, this
  489. operation should have an (amortised) complexity of O(1) with respect
  490. to the number of associations in hash-table.
  491. </p>
  492. </blockquote>
  493. </div>
  494. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873316224" class="indexterm"/> <code class="function">hash-table-set!</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>value</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>void</code></em></p>
  495. <div class="blockquote">
  496. <blockquote class="blockquote">
  497. <p>This procedure sets the value associated to <em class="replaceable"><code>key</code></em> in
  498. <em class="replaceable"><code>hash-table</code></em>. The previous association (if any) is removed. Given
  499. a good hash function, this operation should have an (amortised)
  500. complexity of O(1) with respect to the number of associations in
  501. hash-table.
  502. </p>
  503. </blockquote>
  504. </div>
  505. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873310144" class="indexterm"/> <code class="function">hash-table-delete!</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>void</code></em></p>
  506. <div class="blockquote">
  507. <blockquote class="blockquote">
  508. <p>This procedure removes any association to <em class="replaceable"><code>key</code></em> in
  509. <em class="replaceable"><code>hash-table</code></em>. It is not an error if no association for the
  510. <em class="replaceable"><code>key</code></em> exists; in this case, nothing is done. Given a good hash
  511. function, this operation should have an (amortised) complexity of O(1)
  512. with respect to the number of associations in hash-table.
  513. </p>
  514. </blockquote>
  515. </div>
  516. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873304032" class="indexterm"/> <code class="function">hash-table-exists?</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>boolean</code></em></p>
  517. <div class="blockquote">
  518. <blockquote class="blockquote">
  519. <p>This predicate tells whether there is any association to <em class="replaceable"><code>key</code></em> in
  520. <em class="replaceable"><code>hash-table</code></em>. Given a good hash function, this operation should
  521. have an (amortised) complexity of O(1) with respect to the number of
  522. associations in hash-table.
  523. </p>
  524. </blockquote>
  525. </div>
  526. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873298400" class="indexterm"/> <code class="function">hash-table-update!</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>function</code></em> [ <em class="replaceable"><code>thunk</code></em> ] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>void</code></em></p>
  527. <div class="blockquote">
  528. <blockquote class="blockquote">
  529. <p>Semantically equivalent to, but may be implemented more efficiently than,
  530. the following code:
  531. </p>
  532. <pre class="screen">(hash-table-set! <em class="replaceable"><code>hash-table key</code></em>
  533. (function (hash-table-ref <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>thunk</code></em>)))
  534. </pre>
  535. </blockquote>
  536. </div>
  537. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873290880" class="indexterm"/> <code class="function">hash-table-update!/default</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>function</code></em> <em class="replaceable"><code>default</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>void</code></em></p>
  538. <div class="blockquote">
  539. <blockquote class="blockquote">
  540. <p>Behaves as if it evaluates to
  541. <code class="literal">(hash-table-update! <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>key</code></em> <em class="replaceable"><code>function</code></em> (lambda () <em class="replaceable"><code>default</code></em>))</code>.
  542. </p>
  543. </blockquote>
  544. </div>
  545. </section>
  546. <section class="sect3" title="Dealing with the whole contents" epub:type="division" id="idm139667873283328">
  547. <div class="titlepage">
  548. <div>
  549. <div>
  550. <h4 class="title">Dealing with the whole contents</h4>
  551. </div>
  552. </div>
  553. </div>
  554. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873282240" class="indexterm"/> <code class="function">hash-table-size</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>integer</code></em></p>
  555. <div class="blockquote">
  556. <blockquote class="blockquote">
  557. <p>Returns the number of associations in <em class="replaceable"><code>hash-table</code></em>. This operation takes
  558. constant time.
  559. </p>
  560. </blockquote>
  561. </div>
  562. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873277552" class="indexterm"/> <code class="function">hash-table-keys</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>list</code></em></p>
  563. <div class="blockquote">
  564. <blockquote class="blockquote">
  565. <p>Returns a list of keys in <em class="replaceable"><code>hash-table</code></em>.
  566. The order of the keys is unspecified.
  567. </p>
  568. </blockquote>
  569. </div>
  570. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873272848" class="indexterm"/> <code class="function">hash-table-values</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>list</code></em></p>
  571. <div class="blockquote">
  572. <blockquote class="blockquote">
  573. <p>Returns a list of values in <em class="replaceable"><code>hash-table</code></em>. The order of the values is
  574. unspecified, and is not guaranteed to match the order of keys in the
  575. result of <code class="literal">hash-table-keys</code>.
  576. </p>
  577. </blockquote>
  578. </div>
  579. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873267664" class="indexterm"/> <code class="function">hash-table-walk</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>proc</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>void</code></em></p>
  580. <div class="blockquote">
  581. <blockquote class="blockquote">
  582. <p><em class="replaceable"><code>proc</code></em> should be a function taking two arguments, a key and a
  583. value. This procedure calls <em class="replaceable"><code>proc</code></em> for each association in
  584. <em class="replaceable"><code>hash-table</code></em>, giving the key of the association as key and the
  585. value of the association as value. The results of <em class="replaceable"><code>proc</code></em> are
  586. discarded. The order in which <em class="replaceable"><code>proc</code></em> is called for the different
  587. associations is unspecified.
  588. </p>
  589. </blockquote>
  590. </div>
  591. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873260736" class="indexterm"/> <code class="function">hash-table-fold</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>f</code></em> <em class="replaceable"><code>init-value</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>final-value</code></em></p>
  592. <div class="blockquote">
  593. <blockquote class="blockquote">
  594. <p>This procedure calls <em class="replaceable"><code>f</code></em> for every association in <em class="replaceable"><code>hash-table</code></em>
  595. with three arguments: the key of the association key, the value of the
  596. association value, and an accumulated value, <em class="replaceable"><code>val</code></em>. The <em class="replaceable"><code>val</code></em>
  597. is <em class="replaceable"><code>init-value</code></em> for the first invocation of <em class="replaceable"><code>f</code></em>, and for
  598. subsequent invocations of <em class="replaceable"><code>f</code></em>, the return value of the previous
  599. invocation of <em class="replaceable"><code>f</code></em>. The value <em class="replaceable"><code>final-value</code></em> returned by
  600. <code class="literal">hash-table-fold</code> is the return value of the last invocation of
  601. <em class="replaceable"><code>f</code></em>. The order in which <em class="replaceable"><code>f</code></em> is called for different
  602. associations is unspecified.
  603. </p>
  604. </blockquote>
  605. </div>
  606. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873250368" class="indexterm"/> <code class="function">hash-table-&gt;alist</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>alist</code></em></p>
  607. <div class="blockquote">
  608. <blockquote class="blockquote">
  609. <p>Returns an association list such that the <code class="literal">car</code> of each element
  610. in <em class="replaceable"><code>alist</code></em> is a key in <em class="replaceable"><code>hash-table</code></em> and the corresponding
  611. <code class="literal">cdr</code> of each element in <em class="replaceable"><code>alist</code></em> is the value associated to
  612. the key in <em class="replaceable"><code>hash-table</code></em>. The order of the elements is unspecified.
  613. </p>
  614. <p>The following should always produce a hash table with the same mappings
  615. as a hash table <em class="replaceable"><code>h</code></em>:
  616. </p>
  617. <pre class="screen">(alist-&gt;hash-table (hash-table-&gt;alist <em class="replaceable"><code>h</code></em>)
  618. (hash-table-equivalence-function <em class="replaceable"><code>h</code></em>)
  619. (hash-table-hash-function <em class="replaceable"><code>h</code></em>))
  620. </pre>
  621. </blockquote>
  622. </div>
  623. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873240896" class="indexterm"/> <code class="function">hash-table-copy</code> <em class="replaceable"><code>hash-table</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>hash-table</code></em></p>
  624. <div class="blockquote">
  625. <blockquote class="blockquote">
  626. <p>Returns a new hash table with the same equivalence predicate, hash
  627. function and mappings as in <em class="replaceable"><code>hash-table</code></em>.
  628. </p>
  629. </blockquote>
  630. </div>
  631. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873236192" class="indexterm"/> <code class="function">hash-table-merge!</code> <em class="replaceable"><code>hash-table1</code></em> <em class="replaceable"><code>hash-table2</code></em> <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>hash-table</code></em></p>
  632. <div class="blockquote">
  633. <blockquote class="blockquote">
  634. <p>Adds all mappings in <em class="replaceable"><code>hash-table2</code></em> into <em class="replaceable"><code>hash-table1</code></em> and
  635. returns the resulting hash table. This function may modify
  636. <em class="replaceable"><code>hash-table1</code></em> destructively.
  637. </p>
  638. </blockquote>
  639. </div>
  640. </section>
  641. <section class="sect3" title="Hash functions" epub:type="division" id="idm139667873230176">
  642. <div class="titlepage">
  643. <div>
  644. <div>
  645. <h4 class="title">Hash functions</h4>
  646. </div>
  647. </div>
  648. </div>
  649. <p>The Kawa implementation always calls these hash functions with a single
  650. parameter, and expects the result to be within the entire
  651. (32-bit signed) <code class="literal">int</code> range, for compatibility with
  652. standard <code class="literal">hashCode</code> methods.
  653. </p>
  654. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873227664" class="indexterm"/> <code class="function">hash</code> <em class="replaceable"><code>object</code></em> [ <em class="replaceable"><code>bound</code></em> ] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>integer</code></em></p>
  655. <div class="blockquote">
  656. <blockquote class="blockquote">
  657. <p>Produces a hash value for object in the range from 0 (inclusive) tp to
  658. <em class="replaceable"><code>bound</code></em> (exclusive).
  659. </p>
  660. <p>If <em class="replaceable"><code>bound</code></em> is not given, the Kawa implementation returns a value within
  661. the range <code class="literal">(- (expt 2 32))</code> (inclusive)
  662. to <code class="literal">(- (expt 2 32) 1)</code> (inclusive).
  663. It does this by calling the standard <code class="literal">hashCode</code> method,
  664. and returning the result as is.
  665. (If the <em class="replaceable"><code>object</code></em> is the Java <code class="literal">null</code> value, 0 is returned.)
  666. This hash function is acceptable for <code class="literal">equal?</code>.
  667. </p>
  668. </blockquote>
  669. </div>
  670. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873218560" class="indexterm"/> <code class="function">string-hash</code> <em class="replaceable"><code>string</code></em> [ <em class="replaceable"><code>bound</code></em> ] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>integer</code></em></p>
  671. <div class="blockquote">
  672. <blockquote class="blockquote">
  673. <p>The same as <code class="literal">hash</code>, except that the argument string must be a string.
  674. (The Kawa implementation returns the same as the <code class="literal">hash</code> function.)
  675. </p>
  676. </blockquote>
  677. </div>
  678. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873212960" class="indexterm"/> <code class="function">string-ci-hash</code> <em class="replaceable"><code>string</code></em> [ <em class="replaceable"><code>bound</code></em> ] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>integer</code></em></p>
  679. <div class="blockquote">
  680. <blockquote class="blockquote">
  681. <p>The same as <code class="literal">string-hash</code>, except that the case of characters in
  682. string does not affect the hash value produced.
  683. (The Kawa implementation returns the same the <code class="literal">hash</code> function
  684. applied to the lower-cased <em class="replaceable"><code>string</code></em>.)
  685. </p>
  686. </blockquote>
  687. </div>
  688. <p class="synopsis" kind="Procedure"><span class="kind">Procedure</span><span class="ignore">: </span><a id="idm139667873206896" class="indexterm"/> <code class="function">hash-by-identity</code> <em class="replaceable"><code>object</code></em> [ <em class="replaceable"><code>bound</code></em> ] <em class="replaceable"><code>→</code></em> <em class="replaceable"><code>integer</code></em></p>
  689. <div class="blockquote">
  690. <blockquote class="blockquote">
  691. <p>The same as <code class="literal">hash</code>, except that this function is only guaranteed
  692. to be acceptable for <code class="literal">eq?</code>.
  693. Kawa uses the <code class="literal">identityHashCode</code> method of <code class="literal">java.lang.System</code>.
  694. </p>
  695. </blockquote>
  696. </div>
  697. </section>
  698. </section>
  699. </section>
  700. <footer>
  701. <div class="navfooter">
  702. <ul>
  703. <li>
  704. <b class="toc">
  705. <a href="Hash-tables.xhtml#idm139667873522768">R6RS hash tables</a>
  706. </b>
  707. </li>
  708. <li>
  709. <b class="toc">
  710. <a href="Hash-tables.xhtml#idm139667873378016">SRFI-69 hash tables</a>
  711. </b>
  712. </li>
  713. </ul>
  714. <p>
  715. Up: <a accesskey="u" href="Data-structures.xhtml">Data structures</a></p>
  716. <p>
  717. Previous: <a accesskey="p" href="Arrays.xhtml">Multi-dimensional Arrays</a></p>
  718. </div>
  719. </footer>
  720. </body>
  721. </html>