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">&</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">book</span> <span class="keyword">const</span><span class="special">&</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">&</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"><</span><span class="keyword">int</span><span class="special">></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 & 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"><</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">></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"><</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"><</span><span class="identifier">library</span><span class="special">::</span><span class="identifier">book</span><span class="special">></span> <span class="special">></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