﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Gordon.Ma</title><link>http://www.cppblog.com/gordon/</link><description>近山则志高，临水而聪慧</description><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 20:10:46 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2026 20:10:46 GMT</pubDate><ttl>60</ttl><item><title>【转载】一致性 hash 算法（ consistent hashing ）</title><link>http://www.cppblog.com/gordon/archive/2014/06/26/207423.html</link><dc:creator>Gordooooon</dc:creator><author>Gordooooon</author><pubDate>Thu, 26 Jun 2014 10:27:00 GMT</pubDate><guid>http://www.cppblog.com/gordon/archive/2014/06/26/207423.html</guid><wfw:comment>http://www.cppblog.com/gordon/comments/207423.html</wfw:comment><comments>http://www.cppblog.com/gordon/archive/2014/06/26/207423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gordon/comments/commentRss/207423.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gordon/services/trackbacks/207423.html</trackback:ping><description><![CDATA[<div><strong><span style="font-size: 14pt;">转</span></strong><a href="http://blog.csdn.net/sparkliang/article/details/5279393"><strong style="font-size: 14pt;">载地址： </strong>http://blog.csdn.net/sparkliang/article/details/5279393</a><br /><br />consistent hashing&nbsp;<span style="font-family: 宋体;">算法早在</span>&nbsp;1997&nbsp;<span style="font-family: 宋体;">年就在论文</span>&nbsp;<strong><a href="http://portal.acm.org/citation.cfm?id=258660" target="_blank" style="color: #336699; text-decoration: none;">Consistent hashing and random trees</a>&nbsp;</strong><span style="font-family: 宋体;">中被提出，目前在</span>cache&nbsp;<span style="font-family: 宋体;">系统中应用越来越广泛；</span><h2><a name="t1" style="color: rgb(51, 102, 153); text-decoration: none;"></a>1&nbsp;基本场景</h2><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">比如你有</span>&nbsp;N&nbsp;<span style="font-family: 宋体;">个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">服务器（后面简称</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">），那么如何将一个对象</span>&nbsp;object&nbsp;<span style="font-family: 宋体;">映射到</span>&nbsp;N&nbsp;<span style="font-family: 宋体;">个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">上呢，你很可能会采用类似下面的通用方法计算</span>&nbsp;object&nbsp;<span style="font-family: 宋体;">的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值，然后均匀的映射到到</span>&nbsp;N&nbsp;<span style="font-family: 宋体;">个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">；</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">hash(object)%N</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">&nbsp;&nbsp; 一切都运行正常，再考虑如下的两种情况；</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&nbsp;&nbsp; 1&nbsp;<span style="font-family: 宋体;">一个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">服务器</span>&nbsp;m down&nbsp;<span style="font-family: 宋体;">掉了（在实际应用中必须要考虑这种情况），这样所有映射到</span>&nbsp;cache m&nbsp;<span style="font-family: 宋体;">的对象都会失效，怎么办，需要把</span>&nbsp;cache m&nbsp;<span style="font-family: 宋体;">从</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">中移除，这时候</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">是</span>&nbsp;N-1&nbsp;<span style="font-family: 宋体;">台，映射公式变成了</span>&nbsp;hash(object)%(N-1)&nbsp;<span style="font-family: 宋体;">；</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&nbsp;&nbsp; 2&nbsp;<span style="font-family: 宋体;">由于访问加重，需要添加</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">，这时候</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">是</span>&nbsp;N+1&nbsp;<span style="font-family: 宋体;">台，映射公式变成了</span>&nbsp;hash(object)%(N+1)&nbsp;<span style="font-family: 宋体;">；</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;">1&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;2&nbsp;<span style="font-family: 宋体;">意味着什么？这意味着突然之间几乎所有的</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">都失效了。对于服务器而言，这是一场灾难，洪水般的访问都会直接冲向后台服务器；</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">再来考虑第三个问题，由于硬件能力越来越强，你可能想让后面添加的节点多做点活，显然上面的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">算法也做不到。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&nbsp;&nbsp;<span style="font-family: 宋体;">有什么方法可以改变这个状况呢，这就是</span>&nbsp;consistent hashing...</p><h2><a name="t2" style="color: rgb(51, 102, 153); text-decoration: none;"></a>2 hash&nbsp;算法和单调性</h2><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">　　</span>&nbsp;Hash&nbsp;<span style="font-family: 宋体;">算法的一个衡量指标是单调性（</span>&nbsp;Monotonicity&nbsp;<span style="font-family: 宋体;">），定义如下：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">　　单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中，又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓冲中去，而不会被映射到旧的缓冲集合中的其他缓冲区。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">容易看到，上面的简单</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">算法</span>&nbsp;hash(object)%N&nbsp;<span style="font-family: 宋体;">难以满足单调性要求。</span></p><h2><a name="t3" style="color: rgb(51, 102, 153); text-decoration: none;"></a>3 consistent hashing&nbsp;算法的原理</h2><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;">consistent hashing&nbsp;<span style="font-family: 宋体;">是一种</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">算法，简单的说，在移除</span>&nbsp;/&nbsp;<span style="font-family: 宋体;">添加一个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">时，它能够尽可能小的改变已存在</span>&nbsp;key&nbsp;<span style="font-family: 宋体;">映射关系，尽可能的满足单调性的要求。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">下面就来按照</span>&nbsp;5&nbsp;<span style="font-family: 宋体;">个步骤简单讲讲</span>&nbsp;consistent hashing&nbsp;<span style="font-family: 宋体;">算法的基本原理。</span></p><h3><a name="t4" style="color: rgb(51, 102, 153); text-decoration: none;"></a>3.1&nbsp;环形hash&nbsp;空间</h3><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">考虑通常的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">算法都是将</span>&nbsp;value&nbsp;<span style="font-family: 宋体;">映射到一个</span>&nbsp;32&nbsp;<span style="font-family: 宋体;">为的</span>&nbsp;key&nbsp;<span style="font-family: 宋体;">值，也即是</span>&nbsp;0~2^32-1&nbsp;<span style="font-family: 宋体;">次方的数值空间；我们可以将这个空间想象成一个首（</span>&nbsp;0&nbsp;<span style="font-family: 宋体;">）尾（</span>&nbsp;2^32-1&nbsp;<span style="font-family: 宋体;">）相接的圆环，如下面图</span>&nbsp;1&nbsp;<span style="font-family: 宋体;">所示的那样。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/circle.JPG" alt="circle space" style="border: 0pt none; max-width: 100%;" height="104" width="91" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;1&nbsp;<span style="font-family: 宋体;">环形</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">空间</span></p><h3><a name="t5" style="color: rgb(51, 102, 153); text-decoration: none;"></a>3.2&nbsp;把对象映射到hash&nbsp;空间</h3><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">接下来考虑</span>&nbsp;4&nbsp;<span style="font-family: 宋体;">个对象</span>&nbsp;object1~object4&nbsp;<span style="font-family: 宋体;">，通过</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">函数计算出的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值</span>&nbsp;key&nbsp;<span style="font-family: 宋体;">在环上的分布如图</span>&nbsp;2&nbsp;<span style="font-family: 宋体;">所示。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">hash(object1) = key1;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&#8230; &#8230;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">hash(object4) = key4;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/object.JPG" alt="object" style="border: 0pt none; max-width: 100%;" height="253" width="234" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;2 4&nbsp;<span style="font-family: 宋体;">个对象的</span>&nbsp;key&nbsp;<span style="font-family: 宋体;">值分布</span></p><h3><a name="t6" style="color: rgb(51, 102, 153); text-decoration: none;"></a>3.3&nbsp;把cache&nbsp;映射到hash&nbsp;空间</h3><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;">Consistent hashing&nbsp;<span style="font-family: 宋体;">的基本思想就是将对象和</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">都映射到同一个</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">数值空间中，并且使用相同的</span>&nbsp;hash<span style="font-family: 宋体;">算法。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">假设当前有</span>&nbsp;A,B&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;C&nbsp;<span style="font-family: 宋体;">共</span>&nbsp;3&nbsp;<span style="font-family: 宋体;">台</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">，那么其映射结果将如图</span>&nbsp;3&nbsp;<span style="font-family: 宋体;">所示，他们在</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">空间中，以对应的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值排列。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">hash(cache A) = key A;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&#8230; &#8230;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">hash(cache C) = key C;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/cache.JPG" alt="cache" style="border: 0pt none; max-width: 100%;" height="253" width="283" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;3 cache&nbsp;<span style="font-family: 宋体;">和对象的</span>&nbsp;key&nbsp;<span style="font-family: 宋体;">值分布</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">说到这里，顺便提一下</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">计算，一般的方法可以使用</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">机器的</span>&nbsp;IP&nbsp;<span style="font-family: 宋体;">地址或者机器名作为</span>&nbsp;hash<span style="font-family: 宋体;">输入。</span></p><h3><a name="t7" style="color: rgb(51, 102, 153); text-decoration: none;"></a>3.4&nbsp;把对象映射到cache</h3><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">现在</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">和对象都已经通过同一个</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">算法映射到</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">数值空间中了，接下来要考虑的就是如何将对象映射到</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">上面了。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">在这个环形空间中，如果沿着顺时针方向从对象的</span>&nbsp;key&nbsp;<span style="font-family: 宋体;">值出发，直到遇见一个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">，那么就将该对象存储在这个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">上，因为对象和</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值是固定的，因此这个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">必然是唯一和确定的。这样不就找到了对象和</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">的映射方法了吗？！</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">依然继续上面的例子（参见图</span>&nbsp;3&nbsp;<span style="font-family: 宋体;">），那么根据上面的方法，对象</span>&nbsp;object1&nbsp;<span style="font-family: 宋体;">将被存储到</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">上；</span>&nbsp;object2&nbsp;<span style="font-family: 宋体;">和</span>object3&nbsp;<span style="font-family: 宋体;">对应到</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">；</span>&nbsp;object4&nbsp;<span style="font-family: 宋体;">对应到</span>&nbsp;cache B&nbsp;<span style="font-family: 宋体;">；</span></p><h3><a name="t8" style="color: rgb(51, 102, 153); text-decoration: none;"></a>3.5&nbsp;考察cache&nbsp;的变动</h3><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">前面讲过，通过</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">然后求余的方法带来的最大问题就在于不能满足单调性，当</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">有所变动时，</span>&nbsp;cache<span style="font-family: 宋体;">会失效，进而对后台服务器造成巨大的冲击，现在就来分析分析</span>&nbsp;consistent hashing&nbsp;<span style="font-family: 宋体;">算法。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><strong>3.5.1&nbsp;</strong><strong><span style="font-family: 宋体;">移除</span>&nbsp;cache</strong></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">考虑假设</span>&nbsp;cache B&nbsp;<span style="font-family: 宋体;">挂掉了，根据上面讲到的映射方法，这时受影响的将仅是那些沿</span>&nbsp;cache B&nbsp;<span style="font-family: 宋体;">逆时针遍历直到下一个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">（</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">）之间的对象，也即是本来映射到</span>&nbsp;cache B&nbsp;<span style="font-family: 宋体;">上的那些对象。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">因此这里仅需要变动对象</span>&nbsp;object4&nbsp;<span style="font-family: 宋体;">，将其重新映射到</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">上即可；参见图</span>&nbsp;4&nbsp;<span style="font-family: 宋体;">。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/remove.JPG" alt="remove" style="border: 0pt none; max-width: 100%;" height="253" width="283" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;4 Cache B&nbsp;<span style="font-family: 宋体;">被移除后的</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">映射</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><strong>3.5.2&nbsp;</strong><strong><span style="font-family: 宋体;">添加</span>&nbsp;cache</strong></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">再考虑添加一台新的</span>&nbsp;cache D&nbsp;<span style="font-family: 宋体;">的情况，假设在这个环形</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">空间中，</span>&nbsp;cache D&nbsp;<span style="font-family: 宋体;">被映射在对象</span>&nbsp;object2&nbsp;<span style="font-family: 宋体;">和</span>object3&nbsp;<span style="font-family: 宋体;">之间。这时受影响的将仅是那些沿</span>&nbsp;cache D&nbsp;<span style="font-family: 宋体;">逆时针遍历直到下一个</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">（</span>&nbsp;cache B&nbsp;<span style="font-family: 宋体;">）之间的对象（它们是也本来映射到</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">上对象的一部分），将这些对象重新映射到</span>&nbsp;cache D&nbsp;<span style="font-family: 宋体;">上即可。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">因此这里仅需要变动对象</span>&nbsp;object2&nbsp;<span style="font-family: 宋体;">，将其重新映射到</span>&nbsp;cache D&nbsp;<span style="font-family: 宋体;">上；参见图</span>&nbsp;5&nbsp;<span style="font-family: 宋体;">。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/add.JPG" alt="add" style="border: 0pt none; max-width: 100%;" height="253" width="283" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;5&nbsp;<span style="font-family: 宋体;">添加</span>&nbsp;cache D&nbsp;<span style="font-family: 宋体;">后的映射关系</span></p><h2><a name="t9" style="color: rgb(51, 102, 153); text-decoration: none;"></a>4&nbsp;虚拟节点</h2><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">考量</span>&nbsp;Hash&nbsp;<span style="font-family: 宋体;">算法的另一个指标是平衡性</span>&nbsp;(Balance)&nbsp;<span style="font-family: 宋体;">，定义如下：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">平衡性</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">　　平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去，这样可以使得所有的缓冲空间都得到利用。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">hash&nbsp;<span style="font-family: 宋体;">算法并不是保证绝对的平衡，如果</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">较少的话，对象并不能被均匀的映射到</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">上，比如在上面的例子中，仅部署</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">的情况下，在</span>&nbsp;4&nbsp;<span style="font-family: 宋体;">个对象中，</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">仅存储了</span>&nbsp;object1&nbsp;<span style="font-family: 宋体;">，而</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">则存储了</span>object2&nbsp;<span style="font-family: 宋体;">、</span>&nbsp;object3&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;object4&nbsp;<span style="font-family: 宋体;">；分布是很不均衡的。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">为了解决这种情况，</span>&nbsp;consistent hashing&nbsp;<span style="font-family: 宋体;">引入了&#8220;虚拟节点&#8221;的概念，它可以如下定义：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">&#8220;虚拟节点&#8221;（</span>&nbsp;virtual node&nbsp;<span style="font-family: 宋体;">）是实际节点在</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">空间的复制品（</span>&nbsp;replica&nbsp;<span style="font-family: 宋体;">），一实际个节点对应了若干个&#8220;虚拟节点&#8221;，这个对应个数也成为&#8220;复制个数&#8221;，&#8220;虚拟节点&#8221;在</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">空间中以</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值排列。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">仍以仅部署</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">的情况为例，在图</span>&nbsp;4&nbsp;<span style="font-family: 宋体;">中我们已经看到，</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">分布并不均匀。现在我们引入虚拟节点，并设置&#8220;复制个数&#8221;为</span>&nbsp;2&nbsp;<span style="font-family: 宋体;">，这就意味着一共会存在</span>&nbsp;4&nbsp;<span style="font-family: 宋体;">个&#8220;虚拟节点&#8221;，</span>&nbsp;cache A1, cache A2&nbsp;<span style="font-family: 宋体;">代表了</span>cache A&nbsp;<span style="font-family: 宋体;">；</span>&nbsp;cache C1, cache C2&nbsp;<span style="font-family: 宋体;">代表了</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">；假设一种比较理想的情况，参见图</span>&nbsp;6&nbsp;<span style="font-family: 宋体;">。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/virtual.JPG" alt="virtual nodes" style="border: 0pt none; max-width: 100%;" height="253" width="283" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;6&nbsp;<span style="font-family: 宋体;">引入&#8220;虚拟节点&#8221;后的映射关系</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">此时，对象到&#8220;虚拟节点&#8221;的映射关系为：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">objec1-&gt;cache A2&nbsp;<span style="font-family: 宋体;">；</span>&nbsp;objec2-&gt;cache A1&nbsp;<span style="font-family: 宋体;">；</span>&nbsp;objec3-&gt;cache C1&nbsp;<span style="font-family: 宋体;">；</span>&nbsp;objec4-&gt;cache C2&nbsp;<span style="font-family: 宋体;">；</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">因此对象</span>&nbsp;object1&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;object2&nbsp;<span style="font-family: 宋体;">都被映射到了</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">上，而</span>&nbsp;object3&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;object4&nbsp;<span style="font-family: 宋体;">映射到了</span>&nbsp;cache C&nbsp;<span style="font-family: 宋体;">上；平衡性有了很大提高。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">引入&#8220;虚拟节点&#8221;后，映射关系就从</span>&nbsp;{&nbsp;<span style="font-family: 宋体;">对象</span>&nbsp;-&gt;&nbsp;<span style="font-family: 宋体;">节点</span>&nbsp;}&nbsp;<span style="font-family: 宋体;">转换到了</span>&nbsp;{&nbsp;<span style="font-family: 宋体;">对象</span>&nbsp;-&gt;&nbsp;<span style="font-family: 宋体;">虚拟节点</span>&nbsp;}&nbsp;<span style="font-family: 宋体;">。查询物体所在</span>&nbsp;cache&nbsp;<span style="font-family: 宋体;">时的映射关系如图</span>&nbsp;7&nbsp;<span style="font-family: 宋体;">所示。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><img src="http://www.codeproject.com/KB/recipes/lib-conhash/map.JPG" alt="map" style="border: 0pt none; max-width: 100%;" height="232" width="529" /></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center"><span style="font-family: 宋体;">图</span>&nbsp;7&nbsp;<span style="font-family: 宋体;">查询对象所在</span>&nbsp;cache</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;" align="center">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;">&#8220;虚拟节点&#8221;的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">计算可以采用对应节点的</span>&nbsp;IP&nbsp;<span style="font-family: 宋体;">地址加数字后缀的方式。例如假设</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">的</span>&nbsp;IP&nbsp;<span style="font-family: 宋体;">地址为</span>202.168.14.241&nbsp;<span style="font-family: 宋体;">。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">引入&#8220;虚拟节点&#8221;前，计算</span>&nbsp;cache A&nbsp;<span style="font-family: 宋体;">的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">Hash(&#8220;202.168.14.241&#8221;);</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">引入&#8220;虚拟节点&#8221;后，计算&#8220;虚拟节&#8221;点</span>&nbsp;cache A1&nbsp;<span style="font-family: 宋体;">和</span>&nbsp;cache A2&nbsp;<span style="font-family: 宋体;">的</span>&nbsp;hash&nbsp;<span style="font-family: 宋体;">值：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">Hash(&#8220;202.168.14.241#1&#8221;);<span>&nbsp;&nbsp;// cache A1</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">Hash(&#8220;202.168.14.241#2&#8221;);<span>&nbsp;&nbsp;// cache A2</span></p><h2><a name="t10" style="color: rgb(51, 102, 153); text-decoration: none;"></a>5&nbsp;小结</h2><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;">Consistent hashing&nbsp;<span style="font-family: 宋体;">的基本原理就是这些，具体的分布性等理论分析应该是很复杂的，不过一般也用不到。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><a href="http://weblogs.java.net/blog/2007/11/27/consistent-hashing" style="color: #336699; text-decoration: none;">http://weblogs.java.net/blog/2007/11/27/consistent-hashing</a>&nbsp;<span style="font-family: 宋体;">上面有一个</span>&nbsp;java&nbsp;<span style="font-family: 宋体;">版本的例子，可以参考。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><a href="http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx" style="color: #336699; text-decoration: none;">http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx</a>&nbsp;<span style="font-family: 宋体;">转载了一个</span>&nbsp;PHP&nbsp;<span style="font-family: 宋体;">版的实现代码。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;"><a href="http://www.codeproject.com/KB/recipes/lib-conhash.aspx" style="color: #336699; text-decoration: none;">http://www.codeproject.com/KB/recipes/lib-conhash.aspx</a>&nbsp;C语言版本<br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; text-indent: 21pt;"><span style="font-family: 宋体;"><br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><span style="font-family: 宋体;">一些参考资料地址：</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><a href="http://portal.acm.org/citation.cfm?id=258660" target="_blank" style="color: #336699; text-decoration: none;">http://portal.acm.org/citation.cfm?id=258660</a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><a href="http://en.wikipedia.org/wiki/Consistent_hashing" target="_blank" style="color: #336699; text-decoration: none;">http://en.wikipedia.org/wiki/Consistent_hashing</a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><a href="http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/" target="_blank" style="color: #336699; text-decoration: none;">http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/</a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">&nbsp;<a href="http://weblogs.java.net/blog/2007/11/27/consistent-hashing" style="color: #336699; text-decoration: none;">http://weblogs.java.net/blog/2007/11/27/consistent-hashing</a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><a href="http://tech.idv2.com/2008/07/24/memcached-004/" style="color: #336699; text-decoration: none;">http://tech.idv2.com/2008/07/24/memcached-004/</a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;"><a href="http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx" style="color: #336699; text-decoration: none;">http://blog.csdn.net/mayongzhan/archive/2009/06/25/4298834.aspx</a></p></div><img src ="http://www.cppblog.com/gordon/aggbug/207423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gordon/" target="_blank">Gordooooon</a> 2014-06-26 18:27 <a href="http://www.cppblog.com/gordon/archive/2014/06/26/207423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】Google Protocol Buffer 的使用和原理</title><link>http://www.cppblog.com/gordon/archive/2014/06/19/207339.html</link><dc:creator>Gordooooon</dc:creator><author>Gordooooon</author><pubDate>Thu, 19 Jun 2014 10:06:00 GMT</pubDate><guid>http://www.cppblog.com/gordon/archive/2014/06/19/207339.html</guid><wfw:comment>http://www.cppblog.com/gordon/comments/207339.html</wfw:comment><comments>http://www.cppblog.com/gordon/archive/2014/06/19/207339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gordon/comments/commentRss/207339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gordon/services/trackbacks/207339.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文链接： http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/简介什么是 Google Protocol Buffer？ 假如您在网上搜索，应该会得到类似这样的文字介绍：Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准，目前已经正在使用的有超过 48,162 种报文格式定义和...&nbsp;&nbsp;<a href='http://www.cppblog.com/gordon/archive/2014/06/19/207339.html'>阅读全文</a><img src ="http://www.cppblog.com/gordon/aggbug/207339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gordon/" target="_blank">Gordooooon</a> 2014-06-19 18:06 <a href="http://www.cppblog.com/gordon/archive/2014/06/19/207339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++关键字</title><link>http://www.cppblog.com/gordon/archive/2012/05/22/175763.html</link><dc:creator>Gordooooon</dc:creator><author>Gordooooon</author><pubDate>Tue, 22 May 2012 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/gordon/archive/2012/05/22/175763.html</guid><wfw:comment>http://www.cppblog.com/gordon/comments/175763.html</wfw:comment><comments>http://www.cppblog.com/gordon/archive/2012/05/22/175763.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gordon/comments/commentRss/175763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gordon/services/trackbacks/175763.html</trackback:ping><description><![CDATA[面试过程中，一些面试官对C++一些特殊关键字很关注；<br />整理了一些比较有说头的关键字<br /><ul><li>explicit</li></ul>用来声明构造函数，被声明的构造函数为显示构造函数，不能在隐式转换中使用。<br />C++中一个参数的构造函数或除第一个参数外均有默认值的多参构造函数，有两个作用：1、构造对象；2、默认且隐式的类型转换操作符。<font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; "><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;foo<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">explicit</span><span style="color: #000000; ">&nbsp;foo(&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;)<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;_member(&nbsp;a&nbsp;)<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{}<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_member;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;bar(&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;foo&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;f&nbsp;)<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;f._member;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">bar(&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;失败,&nbsp;explicit禁止int到foo的隐式(implicit)类型转换.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">bar(&nbsp;foo(&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;)&nbsp;);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;正确,&nbsp;显式调用explicit构造函数.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">bar(&nbsp;static_cast</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">foo</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;)&nbsp;);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;正确,&nbsp;通过static_cast调用explicit构造函数.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">bar(&nbsp;foo(&nbsp;</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">&nbsp;)&nbsp;);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;正确,&nbsp;显式调用explicit构造函数,&nbsp;参数自动从浮点转换成整型.</span></div><br /><ul><li>mutable</li></ul></span></font><font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; ">用来声明一个成员变量，被mutable声明的成员变量，可以在被const修饰的成员函数中修改。<br /></span></font><font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; ">mutable不可与const、static同时使用。</span></font><font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; "><br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;foo<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;foo()<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;_member(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{}<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;ExChange(&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a&nbsp;)&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_member&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;a;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;mutable&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_member;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><div><ul><li>volatile</li></ul></div></span></font><font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; "><div>用以声明一个变量，被volatile声明的变量意味着有可能被某些编译器未知的因素更改，因此编译器不会对其做任何优化操作。</div></span></font><font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; "><div><div>从而可以提供对特殊地址的稳定访问，多用于嵌入式编程中。</div></div></span></font><font class="Apple-style-span" face="arial, 宋体, sans-serif"><span class="Apple-style-span" style="line-height: 24px; "><div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;foo()<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">volatile&nbsp;int&nbsp;nData&nbsp;=&nbsp;1;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nData_b&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nData;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">nData&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,nData_b);<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;c++嵌入asm参见：</span><span style="color: #008000; text-decoration: underline; ">http://asm.sourceforge.net/articles/linasm.html</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;asm(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">movl&nbsp;$2,&nbsp;-4(%ebp)\n\r</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;修改变量地址内容</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;nData_a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nData;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">nData&nbsp;=&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,nData_a);<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">使用volatile输出：<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">nData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">nData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">不使用volatile输出为：<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">nData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">nData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span></div></div></div><br /></span></font> <img src ="http://www.cppblog.com/gordon/aggbug/175763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gordon/" target="_blank">Gordooooon</a> 2012-05-22 15:16 <a href="http://www.cppblog.com/gordon/archive/2012/05/22/175763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>