• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5<title>Extending boost::hash for a custom data type</title>
6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9<link rel="up" href="../hash.html" title="Chapter 10. Boost.ContainerHash">
10<link rel="prev" href="tutorial.html" title="Tutorial">
11<link rel="next" href="combine.html" title="Combining hash values">
12</head>
13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14<table cellpadding="2" width="100%"><tr>
15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16<td align="center"><a href="../../../index.html">Home</a></td>
17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20<td align="center"><a href="../../../more/index.htm">More</a></td>
21</tr></table>
22<hr>
23<div class="spirit-nav">
24<a accesskey="p" href="tutorial.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../hash.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="combine.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
25</div>
26<div class="section">
27<div class="titlepage"><div><div><h2 class="title" style="clear: both">
28<a name="hash.custom"></a><a class="link" href="custom.html" title="Extending boost::hash for a custom data type">Extending boost::hash for a custom data type</a>
29</h2></div></div></div>
30<p>
31      <code class="computeroutput"><a class="link" href="../boost/hash.html" title="Struct template hash">boost::hash</a></code> is implemented by calling
32      the function <code class="computeroutput"><a class="link" href="reference.html#boost.hash_va_1_3_11_11_2_2_27_1">hash_value</a></code>.
33      The namespace isn't specified so that it can detect overloads via argument
34      dependant lookup. So if there is a free function <code class="computeroutput"><span class="identifier">hash_value</span></code>
35      in the same namespace as a custom type, it will get called.
36    </p>
37<p>
38      If you have a structure <code class="computeroutput"><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span></code>, where
39      each <code class="computeroutput"><span class="identifier">book</span></code> is uniquely defined
40      by it's member <code class="computeroutput"><span class="identifier">id</span></code>:
41    </p>
42<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">library</span>
43<span class="special">{</span>
44    <span class="keyword">struct</span> <span class="identifier">book</span>
45    <span class="special">{</span>
46        <span class="keyword">int</span> <span class="identifier">id</span><span class="special">;</span>
47        <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">author</span><span class="special">;</span>
48        <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">title</span><span class="special">;</span>
49
50        <span class="comment">// ....</span>
51    <span class="special">};</span>
52
53    <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">book</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">book</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span>
54    <span class="special">{</span>
55        <span class="keyword">return</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">id</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">id</span><span class="special">;</span>
56    <span class="special">}</span>
57<span class="special">}</span>
58</pre>
59<p>
60      Then all you would need to do is write the function <code class="computeroutput"><span class="identifier">library</span><span class="special">::</span><span class="identifier">hash_value</span></code>:
61    </p>
62<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">library</span>
63<span class="special">{</span>
64    <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">hash_value</span><span class="special">(</span><span class="identifier">book</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span>
65    <span class="special">{</span>
66        <code class="computeroutput"><a class="link" href="../boost/hash.html" title="Struct template hash">boost::hash</a></code><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">hasher</span><span class="special">;</span>
67        <span class="keyword">return</span> <span class="identifier">hasher</span><span class="special">(</span><span class="identifier">b</span><span class="special">.</span><span class="identifier">id</span><span class="special">);</span>
68    <span class="special">}</span>
69<span class="special">}</span>
70</pre>
71<p>
72      And you can now use <code class="computeroutput"><a class="link" href="../boost/hash.html" title="Struct template hash">boost::hash</a></code> with
73      book:
74    </p>
75<pre class="programlisting"><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span> <span class="identifier">knife</span><span class="special">(</span><span class="number">3458</span><span class="special">,</span> <span class="string">"Zane Grey"</span><span class="special">,</span> <span class="string">"The Hash Knife Outfit"</span><span class="special">);</span>
76<span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span> <span class="identifier">dandelion</span><span class="special">(</span><span class="number">1354</span><span class="special">,</span> <span class="string">"Paul J. Shanley"</span><span class="special">,</span>
77    <span class="string">"Hash &amp; Dandelion Greens"</span><span class="special">);</span>
78
79<code class="computeroutput"><a class="link" href="../boost/hash.html" title="Struct template hash">boost::hash</a></code><span class="special">&lt;</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">&gt;</span> <span class="identifier">book_hasher</span><span class="special">;</span>
80<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">knife_hash_value</span> <span class="special">=</span> <span class="identifier">book_hasher</span><span class="special">(</span><span class="identifier">knife</span><span class="special">);</span>
81
82<span class="comment">// If std::unordered_set is available:</span>
83<span class="identifier">std</span><span class="special">::</span><span class="identifier">unordered_set</span><span class="special">&lt;</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">,</span> <code class="computeroutput"><a class="link" href="../boost/hash.html" title="Struct template hash">boost::hash</a></code><span class="special">&lt;</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">books</span><span class="special">;</span>
84<span class="identifier">books</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">knife</span><span class="special">);</span>
85<span class="identifier">books</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">(</span><span class="number">2443</span><span class="special">,</span> <span class="string">"Lindgren, Torgny"</span><span class="special">,</span> <span class="string">"Hash"</span><span class="special">));</span>
86<span class="identifier">books</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">(</span><span class="number">1953</span><span class="special">,</span> <span class="string">"Snyder, Bernadette M."</span><span class="special">,</span>
87    <span class="string">"Heavenly Hash: A Tasty Mix of a Mother's Meditations"</span><span class="special">));</span>
88
89<span class="identifier">assert</span><span class="special">(</span><span class="identifier">books</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">knife</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">books</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
90<span class="identifier">assert</span><span class="special">(</span><span class="identifier">books</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">dandelion</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">books</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
91</pre>
92<p>
93      The full example can be found in: <a href="../../../libs/container_hash/examples/books.hpp" target="_top">/libs/container_hash/examples/books.hpp</a>
94      and <a href="../../../libs/container_hash/examples/books.cpp" target="_top">/libs/container_hash/examples/books.cpp</a>.
95    </p>
96<div class="tip"><table border="0" summary="Tip">
97<tr>
98<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../doc/src/images/tip.png"></td>
99<th align="left">Tip</th>
100</tr>
101<tr><td align="left" valign="top"><p>
102        When writing a hash function, first look at how the equality function works.
103        Objects that are equal must generate the same hash value. When objects are
104        not equal they should generate different hash values. In this object equality
105        was based just on the id so the hash function only hashes the id. If it was
106        based on the object's name and author then the hash function should take
107        them into account (how to do this is discussed in the next section).
108      </p></td></tr>
109</table></div>
110</div>
111<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
112<td align="left"></td>
113<td align="right"><div class="copyright-footer">Copyright © 2005-2008 Daniel
114      James<p>
115        Distributed under the Boost Software License, Version 1.0. (See accompanying
116        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
117      </p>
118</div></td>
119</tr></table>
120<hr>
121<div class="spirit-nav">
122<a accesskey="p" href="tutorial.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../hash.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="combine.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
123</div>
124</body>
125</html>
126