招聘网站报表怎么做,创建微信公众号步骤,wordpress 九宫格,成都热点新闻最新说到FNV哈希算法不得不提Memcached#xff0c;我们先简单介绍一下Memcached。MemcachedMemcached分为客户端与服务端#xff0c;Memcached是服务端#xff0c;服务端本身不提供分布式实现#xff0c;只是一个单独的k-v缓存#xff1b;Memcached的分布式是在客户端类库中实… 说到FNV哈希算法不得不提Memcached我们先简单介绍一下Memcached。MemcachedMemcached分为客户端与服务端Memcached是服务端服务端本身不提供分布式实现只是一个单独的k-v缓存Memcached的分布式是在客户端类库中实现的也就是说你可以根据自己的需要实现不同的分布式方案不一定非得使用FNV哈希算法。Memcached通过FNV算法实现了服务的分布式并通过引入虚拟节点的办法尽量是服务器分布的更均匀。已经有很多文章在介绍Memcached的分布式实现原理了所以我就不那么多废话了。FNV分布式hash算法实现如果你还不了解FNV哈希算法可以先看一下我之前的文章在那里我摘录了wiki上的FNV哈希算法实现公式。FNV1算法实现代码实现上我将参考MD5算法的实现来编写FNV1算法首先我将创建一个FNV1类该类需要实现HashAlgorithm之所以实现HashAlgorithm是因为该抽象类定义了hash算法通用的接口这样也可以使我们的实现与.net框架集成的更好当然如果你不喜欢也可以不实现HashAlgorithm就当是写了一个独立的帮助类。然后我们重写Create方法这里我们将创建一个FNV1类的实例最后我们去实现这个FNV1类所有实现代码如下FNV其实还有FNV1a算法与FNV1有些许的区别这里我就不一一实现了你可以参考FNV1的实现和FNV哈希算法来实现FNV1a算法。我有一个帮助类MicroFx.Cryptography分别实现了FNV1和FNV1a的32bit、64bit算法版本。为什么使用FNV算法实现hash一致性无论是分布式算法还是hash一致性算法都不只有一种或几种实现方案但Memached为什么会选择FNV算法而不是md5不是sha呢我有自己的认识。我们先看几行代码分别使用MD5shaFNV算法计算一个Test字符串的哈希值然后对比hash结果中数组的长度var bytes Encoding.UTF8.GetBytes(Test);var shabytes SHA1.Create().ComputeHash(bytes); //shabytes长度为20及160bitvar md5bytesMD5.Create().ComputeHash(bytes); //md5bytes长度为16及128bitvar fnvbytes FNV1a.Create().ComputeHash(bytes); //fnvbytes长度为4及32bit算法取值范围sha1[0,2^160-1]md5[0,2^128-1]fnv[0,2^32-1]从上表我们可以看出FNV的取值范围最小如果将区间内的每一个整数看做一个Memcached服务端节点那么FNV容纳的数量最少但相对于实际的环境下已经足够多了这样我们每次在计算一台服务器属于哪个节点的时候速度上会比md5、sha1快很多。FNV的32bit计算结果值刚好是一个uint类型.net core最大支持ulong也就是uint64再大的话就需要我们自己实现所以这也是选择FNV的一个原因。或许我这里不应该拿.net举例但实际常用的高级语言最大也是64bit原文地址:https://www.cnblogs.com/guodf/p/9681543.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com