<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Katama hash 算法的C#實現

      Katama hash 是經常在分布式解決方案中見到的算法,網上已經有很多文章介紹這個算法或者其他的hash一致性算法

      前一陣子正好在做一個分布式系統的時候需要實現該算法,在網上找了找,發現用C#實現的都不是很好。。

      有一個搜索出來結果最前面最多的實現,性能沒有優化過,代碼可讀性也不是很好。。

      然后各個C#的memcached library中的實現又耦合的太緊了,所以自己搞了下面的這段代碼(參考了這位朋友的實現 http://www.rzrgm.cn/daizhj/archive/2010/08/24/1807324.html)還有Beit的實現

       

      using System;
      using System.Collections.Generic;
      using System.Text;
      using System.Security.Cryptography;
      
      namespace Clover
      {
          public sealed class KetamaHash
          {
              private int[] Values = null;
              private string[] Nodes = null;
      
              public KetamaHash(IEnumerable<string> nodes, int copyNodes = 10000)
              {
                  Refresh(nodes, copyNodes);
              }
      
              /// <summary>
              /// 該方法不是線程安全的,不過這個方法應該是很少調用的,只有在服務器列表變更的時候才需要調用該方法
              /// </summary>
              /// <param name="nodes"></param>
              /// <param name="copyNodes"></param>
              public void Refresh(IEnumerable<string> nodes, int copyNodes = 10000)
              {
                  if (nodes == null)
                  {
                      throw new ArgumentNullException("nodes");
                  }
                  if (copyNodes <= 0)
                  {
                      throw new ArgumentOutOfRangeException("virualNodes");
                  }
      
                  SortedList<int, string> dict = new SortedList<int, string>();
                  HashSet<string> sortedNodes = new HashSet<string>();
                  foreach (var item in nodes)
                  {
                      if (item != null)
                          sortedNodes.Add(item);
                  }
      
                  if ((sortedNodes.Count * copyNodes) > 320 * 1000)
                  {
                      throw new ArgumentOutOfRangeException("There is too many copyNodes or real nodes! nodes.Count multiply copyNodes must be not greater than 320*1000 ");
                  }
      
                  foreach (var node in sortedNodes)
                  {
                      for (int i = 0; i < copyNodes / 4; i++)
                      {
                          byte[] digest = Hash(node + "_" + i);
                          for (int h = 0; h < 4; h++)
                          {
                              int m = BitConverter.ToInt32(digest, 0 * 4);
                              dict[m] = node;
                          }
                      }
                  }
      
                  var newValues = new int[dict.Keys.Count];
                  var newNodes = new string[dict.Keys.Count];
                  dict.Keys.CopyTo(newValues, 0);
                  dict.Values.CopyTo(newNodes, 0);
      
                  Values = newValues; // thread not safty
                  Nodes = newNodes; // thread not safty
      
              }
      
              public string GetNodeByKey(string key)
              {
                  int value = BitConverter.ToInt32(Hash(key), 0); //first 4 byte to int32
                  int result = Array.BinarySearch<int>(Values, value);
                  if (result < 0)
                      result = ~result;
                  if (result >= Nodes.Length)
                      return Nodes[Nodes.Length - 1];
                  else
                      return Nodes[result];
              }
      
              #region Private Supported Method
              private byte[] Hash(byte[] source)
              {
                  HashAlgorithm helper = new MD5CryptoServiceProvider();
                  return helper.ComputeHash(source);
              }
              private byte[] Hash(string s)
              {
                  return Hash(Encoding.UTF8.GetBytes(s));
              }
              #endregion
          }
      }
      

       

       

      測試代碼如下:

        static void Main(string[] args)
              {
                  List<string> nodes = new List<string>();
                  for (int i = 0; i < 16; i++)
                  {
                      nodes.Add(Guid.NewGuid().ToString());//用來做測試代碼。。。。的隨機值
                  }
                  KetamaHash target = new KetamaHash(nodes, 10000);
      
                  Dictionary<string, int> dict = new Dictionary<string, int>();
                  Stopwatch sw = new Stopwatch();
                  sw.Start();
                  for (int i = 0; i < 1000 * 1000; i++)//運行一百萬次
                  {
                      var result = target.GetNodeByKey(Guid.NewGuid().ToString());//用來做測試代碼。。。。的隨機值
                      if (result == null)
                      {
                          throw new Exception("沒取到數據");
                      }
                      if (dict.ContainsKey(result))
                      {
                          dict[result]++;
                      }
                      else
                      {
                          dict[result] = 1;
                      }
                  }
                  sw.Stop();
      
                  long maxNumber = dict.Values.Max();
                  long minNumber = dict.Values.Min();
      
                  double temp = (maxNumber - minNumber) / Convert.ToDouble(maxNumber);
      
                  Console.WriteLine(temp);
                  Console.WriteLine(sw.ElapsedMilliseconds);
      
                  if (temp >= 0.1)
                  {
                      Console.WriteLine("數據分布不均勻,嘗試增加虛擬節點會更均勻點");
                  }
                  if (sw.ElapsedMilliseconds >= 12 * 1000)
                  {
                      Console.WriteLine("跑的太慢....當然 也有可能是你的機器太爛。。。。哈哈~");
                  }
      
      
              }
      

        

      虛擬節點越多,數據分配越均勻,不過性能也相對差一點, 這邊推薦使用10000,分配會比較均勻,速度也不慢

      經過性能測試 95% 以上的性能消耗在MD5算法中,

      如果換掉MD5的hash算法性能會好點。。。。

      posted on 2012-03-15 20:25  聽說讀寫  閱讀(1013)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 人妻少妇偷人一区二区| 久久天天躁狠狠躁夜夜婷| gogogo高清在线观看视频中文| www久久只有这里有精品| 熟女少妇精品一区二区| 亚洲成人一区二区av| 另类 亚洲 图片 激情 欧美| 亚洲精品免费一二三区| 夜夜爽77777妓女免费看| 国产精品综合一区二区三区| 狠狠色婷婷久久综合频道日韩| 亚洲乱熟女一区二区三区| 黑巨人与欧美精品一区| 国产无套护士在线观看| 精品亚洲精品日韩精品| 日韩精品中文字幕第二页| 免费又爽又大又高潮视频| 香港日本三级亚洲三级| 午夜精品极品粉嫩国产尤物| 国产精品青草久久久久福利99| 免费午夜无码片在线观看影院| 国产69精品久久久久乱码免费 | 日韩人妻无码精品久久| 无码人妻一区二区三区线| 麻豆果冻国产剧情av在线播放| 欧美熟妇xxxxx欧美老妇不卡| 免费a级毛片无码av| 乱人伦中文字幕成人网站在线| 亚洲国产精品无码久久电影| 99久久伊人精品综合观看| 午夜色大片在线观看免费| 狠狠综合久久综合88亚洲| 日本高清一区二区三| 国产69精品久久久久久| 人妻少妇456在线视频| 国产仑乱无码内谢| 在线a人片免费观看| 加勒比无码av中文字幕| 日本一区二区三区专线| 久久狠狠高潮亚洲精品夜色| 四虎影视久久久免费|