首页 > 其他分享 >一致性哈希(Consistent Hashing)

一致性哈希(Consistent Hashing)

时间:2024-09-04 10:51:29浏览次数:12  
标签:node 函数 self 节点 哈希 一致性 Consistent Hashing

基本概念

        一致性哈希(Consistent Hashing)是一种特殊的哈希算法,主要用于解决分布式系统中数据分布的问题,尤其是在需要动态添加或移除服务器(节点)的情况下。传统哈希算法在节点变化时可能会导致大部分甚至全部的数据重新分布,这样会导致大量的数据迁移,增加了系统的复杂性和成本。而一致性哈希算法的设计目标是在添加或移除节点时,尽可能减少数据的迁移量,从而提高系统的稳定性和效率。

        一致性哈希的基本思想是将所有的数据键(keys)和存储节点(nodes)通过哈希函数映射到一个固定的环形空间(通常称为哈希环)。这个环形空间可以想象成一个圆形的尺子,其范围是从0到最大哈希值。每个节点在环上有一个位置,这个位置是由节点的标识符(如IP地址)经过哈希计算得到的。同样,数据键也会被哈希并放置在环上的相应位置。

        当需要存储或检索某个键时,一致性哈希算法会首先计算出该键的哈希值,然后沿着哈希环顺时针方向寻找最近的节点。这个节点就是负责存储或提供该键数据的服务节点。如果在这个过程中遇到虚拟节点,则会继续前进直到找到实际的物理节点为止。

        一致性哈希在分布式缓存、文件系统、数据库分区等场景中有广泛应用。

特点

  • 负载均衡:理论上,每个节点应该负责哈希环上的一部分区间,从而使得数据均匀分布在各个节点上。
  • 平滑伸缩:当添加或移除节点时,只会影响环上该节点顺时针方向上的数据,其他数据不受影响。
  • 容错性:通过引入虚拟节点,即使物理节点失效,也可以通过其他物理节点上的虚拟节点来缓解数据访问的压力。

常用的Hash函数

        在一致性哈希中,选择合适的哈希函数对于确保数据分布的均匀性和系统的性能至关重要。常用的一致性哈希函数包括但不限于以下几种:

1. MD5 (Message Digest Algorithm 5):
   - MD5 是一种广泛使用的散列函数,产生 128 位(16 字节)的散列值。尽管在安全性方面已经被认为不够强大,但对于一致性哈希来说,MD5 仍然能够提供良好的散列分布,并且计算速度较快。

2. SHA-1 (Secure Hash Algorithm 1):
   - SHA-1 产生的散列值大小为 160 位(20 字节),比 MD5 更加安全,但在一致性哈希中,两者的效果类似。SHA-1 同样具有较好的散列分布特性。

3. SHA-256 (Secure Hash Algorithm 256):
   - SHA-256 产生的散列值大小为 256 位(32 字节),相比 MD5 和 SHA-1 更加安全。SHA-256 提供了更好的安全性,但计算开销相对较大。

4. FNV (Fowler–Noll–Vo) Hash:
   - FNV 哈希是一种非加密的哈希函数,具有较高的执行速度和良好的分布特性。FNV 哈希有不同的变种,如 FNV-1 和 FNV-1a,以及不同的位数(如 32 位、64 位等)。

5. MurmurHash:
   - MurmurHash 是一种非加密的哈希函数,设计用于快速哈希大量数据。它支持多种位数(如 32 位、64 位),并且具有较好的性能和散列质量。

6. CRC32 (Cyclic Redundancy Check 32):
   - CRC32 是一种常见的校验码算法,也被用作哈希函数。虽然它不是专门设计用于哈希的,但在某些情况下,它可以提供足够的散列分布。

7. CityHash:
   - CityHash 是由 Google 开发的一种高速哈希函数,专为快速处理大数据块设计。它提供了非常高的吞吐率和良好的分布特性。

8. xxHash:
   - xxHash 是另一种高性能的非加密哈希函数,旨在提供快速的哈希速度和高质量的散列分布。

选择哈希函数时,需要考虑以下几个因素:

  • 安全性:如果一致性哈希系统涉及到敏感数据,那么应该选择更安全的哈希函数。
  • 计算性能:在高并发场景下,哈希函数的计算速度尤为重要。
  • 散列质量:哈希函数应该能够提供均匀的散列分布,避免热点问题。
  • 兼容性:所选哈希函数应与现有的系统架构相兼容。

        在实际应用中,开发者需要根据具体的场景和需求选择最适合的哈希函数。例如,在不需要高强度安全性的场景下,可以选择速度更快的哈希函数如 FNV 或 MurmurHash;而在需要更高安全性的场景下,则可能选择 SHA-256 这样的哈希函数。

代码实现

import hashlib
from bisect import bisect

class ConsistentHashRing:
    def __init__(self, replicas=100):
        self.replicas = replicas
        self.ring = {}
        self.sorted_keys = []

    def _hash(self, key):
        """使用MD5哈希算法"""
        md5_hash = hashlib.md5(key.encode()).hexdigest()
        return int(md5_hash, 16)

    def add_node(self, node):
        """向一致性哈希环中添加节点"""
        for i in range(self.replicas):
            hash_key = f"{node}-{i}"
            position = self._hash(hash_key)
            self.ring[position] = node
            # 保持sorted_keys排序
            insert_pos = bisect(self.sorted_keys, position)
            self.sorted_keys.insert(insert_pos, position)

    def get_node(self, key):
        """根据键获取对应的节点"""
        if not self.ring:
            return None

        hash_value = self._hash(key)
        # 查找环上顺时针方向上的第一个节点
        pos = bisect(self.sorted_keys, hash_value)
        # 如果键位于最大的哈希值之后,则返回环的第一个节点
        if pos == len(self.sorted_keys):
            pos = 0
        return self.ring[self.sorted_keys[pos]]

# 示例代码
if __name__ == "__main__":
    ch_ring = ConsistentHashRing(replicas=100)
    nodes = ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
    for node in nodes:
        ch_ring.add_node(node)

    key = "key1"
    node = ch_ring.get_node(key)
    print(f"Key {key} maps to node {node}")

在以上示例代码中,我们假设有三个真实的节点,并且每个节点都有100个虚拟节点,以提高负载均衡性。

标签:node,函数,self,节点,哈希,一致性,Consistent,Hashing
From: https://blog.csdn.net/xy2006860/article/details/141886147

相关文章

  • 【代码随想录Day6】哈希表Part01|判断一个元素是否出现集合里
    哈希表理论基础文章讲解:哈希表理论基础要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。242.有效的字母异位词题目链接/文章讲解/视频讲解:有效的字母异位词定义一个哈希表record,遍历s,记录s中每个字母出现的次数,遍历t,减去t中每个字母出现的次数,遍历......
  • 让AI学会打光,从此利好电商(Stable Diffusion进阶篇:Imposing Consistent Light)
    IC-Light的下载安装有两个不同的节点包可以在ComfyUI中安装IC-Light,一个是kijai大佬的节点包:https://github.com/kijai/ComfyUI-IC-Light没有魔法的小伙伴可以扫描下面二维码获取相关整合资料!另一个是huchenlei大佬的节点包:https://github.com/huchenlei/ComfyUI-IC......
  • 异或哈希
    简介我们知道哈希就是把一个字符串转化为一个数字。但普通的哈希是有顺序的,而如果我们想判断两个集合是否相同,就需要使用异或哈希了。思路异或哈希,就是把每一种值映射到某一个随机数上,再把它们异或起来。因为异或具有交换律,所以可以比较集合。但我们怎么保证异或哈希的正确性......
  • 代码随想录算法day4 - 哈希表2
    题目1454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4......
  • 【寻迹#3】 哈希与哈希表
    哈希和哈希表哈希算法是通过一个哈希函数\(\operatornameH\),将一种数据(包括字符串、较大的数等)转化为能够用变量表示或是直接就可作为数组下标的数,通过哈希函数转化得到的数值我们称之为哈希值。通过哈希值可以实现快速查找和匹配。哈希算法具体应用有:字符串\(\operatorname......
  • 【Leetcode_Hot100】哈希
    哈希1.两数之和49.字母异位词分组128.最长连续序列1.两数之和方法一:HashMap在元素放入数组之前就进行判断,保证了不会取出同一个元素的情况,,例如[3,3],如果先将数组中的所有元素放入hashMap,再判断是否存在,则返回结果为[1,1],不符合题意。classSolution{publicint[......
  • 基于感知哈希算法的以图搜图系统的设计
    摘 要随着数字媒体和计算机网络的迅猛发展,互联网上在线图像的飞速增长,用户对图形图像的搜索需求日益提高,一种“以图搜图”的新型搜索模式应运而生。“以图搜图”是以用户提供的图形图像图片等为视觉特征基础,为用户提供互联网上相关图形图像资料检索服务,这是一种专业的搜索引......
  • 代码随想录算法day5 - 哈希表1
    题目1242.有效的字母异位词给定两个字符串*s*和*t*,编写一个函数来判断*t*是否是*s*的字母异位词。字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,通常只使用所有原始字母一次。示例1:输入:s="anagram",t="nagaram"输出:true示例2:......
  • 哈希表hashtable课堂笔记
    /*哈希表,表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。它的每个元素都是一个存储在DictionaryEntry对象中的键/值对。键不能为空引用,但值可以。哈希表的构造函数有多种,这里介绍两种最常用的。*///(1)使用默认的初始容量、加载因子、哈希代码提供程序和比......
  • Hash哈希学习笔记
    概念:通过一个hash函数建立值与存储地址的关系原则:开小数组+冲突解决冲突越少,用时越少;可通过调整余数或优质的hash算法尽量使hash值分散,减少碰撞hash算法的构成:hash函数的初始化构造hash函数:典型的函数包括除余法H......