最近在看redis之类的pdf,发现redis在做集群的时候,不同的key分到不同的主服务器,其中划分key的算法采用CRC16算法,所以特此整理一下其C#code如下:

  #region CRC16
/// <summary>
/// Computes the hash-slot that would be used by the given key
/// </summary>
public static unsafe int HashSlot(string key)
{
//HASH_SLOT = CRC16(key) mod 16384
if (string.IsNullOrEmpty(key)) return -;
unchecked
{
//var blob = (byte[])key;
var blob = Encoding.UTF8.GetBytes(key);
fixed (byte* ptr = blob)
{
int offset = , count = blob.Length, start, end;
if ((start = IndexOf(ptr, (byte)'{', , count - )) >=
&& (end = IndexOf(ptr, (byte)'}', start + , count)) >=
&& --end != start)
{
offset = start + ;
count = end - start; // note we already subtracted one via --end
} uint crc = ;
for (int i = ; i < count; i++)
crc = ((crc << ) ^ crc16tab[((crc >> ) ^ ptr[offset++]) & 0x00FF]) & 0x0000FFFF;
return (int)(crc % );
}
}
}
static unsafe int IndexOf(byte* ptr, byte value, int start, int end)
{
for (int offset = start; offset < end; offset++)
if (ptr[offset] == value) return offset;
return -;
}
static readonly ushort[] crc16tab =
{
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
};
#endregion

在redis的bitcount函数里面有一个汉明重量的算法(其实就是看二进制数组中1的个数),其pdf中的code如下,redis里面提到的汉明重量code 只是考虑到了长度为32的字节数组。

   public static uint bitCount(uint i)
{
// HD, Figure 5-2
i = (i & 0x55555555) + ((i >> ) & 0x55555555);
i = (i & 0x33333333) + ((i >> ) & 0x33333333);
i = (i & 0x0f0f0f0f) + (i >> ) & 0x0f0f0f0f;
i = (i * (0x01010101) >> );
return i;
}

网上也有该算法类似实现:

  public static int bitCount(int i)
{
// HD, Figure 5-2
i = i - ((i >> ) & 0x55555555);
i = (i & 0x33333333) + ((i >> ) & 0x33333333);
i = (i + (i >> )) & 0x0f0f0f0f;
i = i + (i >> );
i = i + (i >> );
return i & 0x3f;
}

网上也有一些简单的算法如:

       public static int bitCount(int i)
{
int num = ;
while (i != )
{
i &= (i - );
num++;
}
return num;
}

我们相爱撸代码的时候还是需要考虑code的时间复杂度和空间复杂度。

最新文章

  1. 卡片抽奖插件 CardShow
  2. leetcode一些常用函数
  3. 【Java EE 学习 33 下】【validate表单验证插件】
  4. iOS开发 获取状态栏的点击事件
  5. php 经典的算法题你懂的
  6. iptables防火墙作为基本需求的配置
  7. Careercup | Chapter 8
  8. 【笨嘴拙舌WINDOWS】实践检验之GDI缩放
  9. NSArray 迭代
  10. 程序员的编辑器——VIM
  11. CoreData (三)备
  12. 自定义ASP.NET WebApplication中调用SharePoint2010的对象
  13. 我们究竟什么时候可以使用Ehcache缓存(转)
  14. 【极简】如何挑选合适的百度BCC,并安装宝塔控制面板
  15. WC2019 题目集
  16. Java如何从IP地址查找主机名?
  17. KiCad 如何画板框
  18. netty4初步使用
  19. Email standards
  20. Selenium定位元素-Xpath的使用方法

热门文章

  1. Windows Mysql安装
  2. laravel migrate 指定执行部分 migration
  3. bzoj 1060
  4. js事件监听
  5. 《剑指offer》-数组中出现次数超过一半的数字
  6. 基于jsp+servlet图书管理系统之后台用户信息插入操作
  7. URL中带加号的处理
  8. POJ 2385 Apple Catching【DP】
  9. python日期与时间
  10. mybatis DATE_FORMAT 格式化时间输出