抠百科
手机版
 您现在的位置:  首页 > 生活常识 >

hash算法有哪几种?如何计算

100次浏览     发布时间:2024-07-22 11:46:50    

Hash算法的有哪几种,优缺点,使用场景

Hash ,一般叫做散列算法,就是把任意长度的输入通过散列算法,变换成固定长度的输入,相当于一种压缩映射,将任意长度的消息压缩到某一固定长度的消息摘要的函数。

• 加法Hash;把输入元素一个一个的加起来构成最后的结果

/**
  * 加法hash
  *
  * @param key
  *            字符串
  * @param prime
  *            一个质数
  * @return hash结果
  */
public static int additiveHash(String key, int prime) {
  int hash, i;
  for (hash = key.length(), i = 0; i < key.length(); i++)
      hash += key.charAt(i);
  return (hash % prime);
}

• 位运算Hash;这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素

/**
  * 旋转hash
  *
  * @param key
  *            输入字符串
  * @param prime
  *            质数
  * @return hash值
  */
public static int rotatingHash(String key, int prime) {
  int hash, i;
  for (hash = key.length(), i = 0; i < key.length(); ++i)
      hash = (hash << 4) ^ (hash >> 28) ^ key.charAt(i);
  return (hash % prime);
  // return (hash ^ (hash>>10) ^ (hash>>20));
}

• 乘法Hash;这种类型的Hash函数利用了乘法的不相关性(乘法的这种性质,最有名的莫过于平方取头尾的随机数生成算法,虽然这种算法效果并不好);

static int bernstein(String key)
{
 int hash = 0;
 int i;
 for (i=0; i<key.length(); ++i) hash = 33*hash + key.charAt(i);
 return hash;
}

jdk5.0里面的String类的hashCode()方法也使用乘法Hash;32位FNV算法

int M_SHIFT = 0;
public int FNVHash(byte[] data) {
  int hash = (int2166136261L;
  for(byte b : data)
    hash = (hash * 16777619) ^ b;
  if(M_SHIFT == 0)
    return hash;
  return (hash ^ (hash >> M_SHIFT)) & M_MASK;
}

改进后的 FNV 算法

public static int FNVHash1(String data) {
  final int p = 16777619;
  int hash = (int) 2166136261L;
  for (int i = 0; i < data.length(); i++)
   hash = (hash ^ data.charAt(i)) * p;
  hash += hash << 13;
  hash ^= hash >> 7;
  hash += hash << 3;
  hash ^= hash >> 17;
  hash += hash << 5;
  return hash;
 }

常见的还有乘以一个不断改变的数

static int RSHash(String str) {
  int b = 378551;
  int a = 63689;
  int hash = 0;
  for (int i = 0; i < str.length(); i++) {
   hash = hash * a + str.charAt(i);
   a = a * b;
  }
  return (hash & 0x7FFFFFFF);
 }

• 除法Hash;除法和乘法一样,同样具有表面上看起来的不相关性。不过,因为除法太慢,这种方式几乎找不到真正的应用

• 查表Hash;查表Hash最有名的例子莫过于CRC系列算法。虽然CRC系列算法本身并不是查表,但是,查表是它的一种最快的实现方式。查表Hash中有名的例子有:Universal Hashing和Zobrist Hashing。他们的表格都是随机生成的。

• 混合Hash;混合Hash算法利用了以上各种方式。各种常见的Hash算法,比如MD5、Tiger都属于这个范围。它们一般很少

  • 数组 hash
inline int hashcode(const int *v)
{
  int s = 0;
  for(int i=0; i<k; i++)
    s=((s<<2)+(v[i]>>4))^(v[i]<<10);
  s = s % M;
  s = s < 0 ? s + M : s;
  return s;
}

在面向查找的Hash函数里面使用

环 hash

环 hash 计算步骤

  1. 首先求出哈希值, 并将其分配到 0~2^32 的圆上,其实把机器编号 hash 到这个环上。
  2. 采用同样的方法求出存储数据键的哈希值,并映射到相同的圆上
  3. 然后从数据映射到位置开始顺时针开始找,将数据保存到找到的第一个服务器,如果 2^32 仍然找不到服务器,就会保存到第一台服务器上。

image

环 hash 存在的问题

数据倾斜问题

数据倾斜是指,当机器不多时,几台机器在环上面贴的很近,分布是不是很均匀,会导致大部分数据集中到这几台机器上,这样就产生了数据倾斜问题。

如何解决数据倾斜问题?

引入了虚拟机器概念,一台机器需要在环上映射出多个这个位置,比如 我们用机器的 ip 来 hash ,这样就实现了一台物理机映射出多个虚拟机器的编号。

相关文章

  • 专属攻略1. 魂师升级与阵容搭配魂师升级:游戏中的魂师是核心战斗单位,优先升级主要魂师可以提高整体战斗力。合理利用经验瓶和金币堆,将星级最高的魂师放入对应堂口以最大化经验和金币收益。阵容搭配:合理的阵容搭配能够发挥魂师的最大效能。以下是一些推荐的平民阵容:少年唐三、少年小舞、唐三、叶泠泠、水冰儿、水
    2024-11-23 10:30:35
  • 植物大战僵尸2天空之城第19天攻略,这一关的僵尸与上一关相同,都是仲裁者-X型,想要消灭它,就赶紧来看看下面小编为大家带来的植物大战僵尸2天空之城第19天图文攻略。 本关带的关卡植物有:电离红掌、飞碟瓜、灯笼草、芦笋战机、旋转芜菁、阳光蘑菇、窝瓜、冰西瓜。 1、疯狂种植阳光蘑菇,一开始小编以为二阶芦
    2024-11-23 10:15:30
  • 王者荣耀现版本孙悟空怎么玩?下面小编为大家带来王者荣耀现版本孙悟空玩法详解,希望这篇攻略详解能够对大家有所帮助。关于猴子出装,小编这套专门应对这个版本的装备在排位测试拿过9连胜,匹配每天来个五连胜十连胜的太正常了,打野刀加军团,加破军鞋子,加霸者绿甲,带惩戒,基本四神装以后开团可以硬刚吕布。这个版本
    2024-11-23 10:00:32
  • 双生幻想洛可可3-1怎么过?双生幻想推出了洛可可的闯关活动,玩家需要上阵角色通关关卡才能拿到奖励,带来双生幻想洛可可剧情挑战第三章3-1通关攻略双生幻想洛可可剧情挑战第三章3-1通关攻略1、第三章的难度还是非常大的,很多玩家都卡在第三章过不去,过不去的玩家可以参考下上面的阵容。2、按照上面的阵容上阵
    2024-11-23 09:46:06
  • 在热血江湖中有一部分玩家石头和强化都做完了,但是到了属性石头赋予的时候就犯难了,因为各种石头加成都不一样,衣服和武器都能赋予、石头种类还多,今天这里给大家推荐一下各种不同的玩法赋予;火属性石头:武器-无视对方部分防御力,衣服-无视部分攻击力水属性石头:武器-攻击时使对方愤怒值归零,衣服-被攻击时获
    2024-11-23 09:31:16
  •  热血江湖是一款非常受欢迎的游戏,其中剑技能更是让人称道的绝技。剑技能在游戏中的作用非常大,可以让你在战斗中更加得心应手,提高自己的战斗力。那么,如何学习剑技能呢?下面就为大家详细介绍一下。  1. 首先,你需要,创建角色,男女角色,选择正邪势力,正剑,攻击起手的速度高,邪剑的攻击下限高  2. 学
    2024-11-23 09:16:29