分享一个新的对字符串的哈希算法之FastHash
来源:互联网 发布:制作蹭饭地图软件 编辑:程序博客网 时间:2024/05/16 13:04
算法如下:
#if OGRE_ENDIAN == OGRE_ENDIAN_LITTLE 大端小端 自己定义一下
# define OGRE_GET16BITS(d) (*((const uint16 *) (d)))
#else
# define OGRE_GET16BITS(d) (*((const uint8 *) (d)) + (*((const uint8 *) (d+1))<<8))
#endif
# define OGRE_GET16BITS(d) (*((const uint16 *) (d)))
#else
# define OGRE_GET16BITS(d) (*((const uint8 *) (d)) + (*((const uint8 *) (d+1))<<8))
#endif
//说明:一般情况下,hashSoFar 设置为0.
uint32 FastHash (const char * data, int len, uint32 hashSoFar)
{
uint32 hash;
uint32 tmp;
int rem;
uint32 FastHash (const char * data, int len, uint32 hashSoFar)
{
uint32 hash;
uint32 tmp;
int rem;
if (hashSoFar)
hash = hashSoFar;
else
hash = len;
hash = hashSoFar;
else
hash = len;
if (len <= 0 || data == NULL) return 0;
rem = len & 3;
len >>= 2;
len >>= 2;
/* Main loop */
for (;len > 0; len--) {
hash += OGRE_GET16BITS (data);
tmp = (OGRE_GET16BITS (data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2*sizeof (uint16);
hash += hash >> 11;
}
for (;len > 0; len--) {
hash += OGRE_GET16BITS (data);
tmp = (OGRE_GET16BITS (data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2*sizeof (uint16);
hash += hash >> 11;
}
/* Handle end cases */
switch (rem) {
case 3: hash += OGRE_GET16BITS (data);
hash ^= hash << 16;
hash ^= data[sizeof (uint16)] << 18;
hash += hash >> 11;
break;
case 2: hash += OGRE_GET16BITS (data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += *data;
hash ^= hash << 10;
hash += hash >> 1;
}
switch (rem) {
case 3: hash += OGRE_GET16BITS (data);
hash ^= hash << 16;
hash ^= data[sizeof (uint16)] << 18;
hash += hash >> 11;
break;
case 2: hash += OGRE_GET16BITS (data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += *data;
hash ^= hash << 10;
hash += hash >> 1;
}
/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash;
}
}
0 0
- 分享一个新的对字符串的哈希算法之FastHash
- 对字符串进行哈希的算法,hash_func
- for语句对字符串的新用法
- 分享一个类似于MFC的字符串类
- 我对程序开源、源码分享的新理解
- 一个字符串倒置的算法
- 反转一个字符串的算法
- 分享一个公历转农历的算法
- 大神分享的一个算法题
- 分享一个字节转换的算法
- 分享一个自己写的字符串工具:字符串格式化拼接
- 哈希表对字符串的高效处理3:实现一个听高级的字符匹配算法
- 一个新的算法:珠排序
- 给大家分享一个JavaScript的SHA1(哈希算法)
- 分享一段对字符串进行HTML编码解码的代码
- 对一道“写一个算法实现字符串逆序存储,要求不另设串存储空间.”题目的总结!
- 关于输入一个字符串,对其进行全排列的两种算法
- 对旋转字符串算法的理解
- 结对学发音
- 将Throwable的信息转换为字符串
- win7添加防火墙例外的程序和端口
- Hdu 2110 Crisis of HDU 母函数
- 递归处理多层嵌套列表
- 分享一个新的对字符串的哈希算法之FastHash
- 基于coocs2d-x quick 的图形填充
- linux tftp创建
- android ,点击title的ImageView弹出PopupWindow
- Nutch-2.2.1----过滤抓取数据
- Android中如何使用ViewPager实现类似laucher左右拖动效果
- 超级新手第一次修饰代码 不知道规范吗?请高手评价,谢谢了,
- ibatis typeHandler setparmeter list处理
- Android 获取SIM卡运营商 .