PHP实现一致性hash

随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。

 

取模算法

 

取模运算通常用于得到某个半开区间内的值:m % n = v,其中n不为0,值v的半开区间为:[0, n)。取模运算的算法很简单:有正整数k,并令k使得k和n的乘积最大但不超过m,则v的值为:m - kn。比如1 % 5,令k = 0,则k * 5的乘积最大并不超过1,故结果v = 1 - 0 * 5 = 1。

我们在分表时也会用到取模运算。如一个表要划分三个表,则可对3进行取模,因为结果总是在[0, 3)之内,也就是取值为:0、1、2。

在redis场景中,使用取模算法,如果机器数量变化,则会造成缓存key的重新落点到新的机器,这样会造成很多缓存失效,从而对服务器造成压力,高并发的情况下,还可能造成雪崩。 而一致性hash算法可以很好的缩小影响范围,下面简单介绍下hash算法。

 

哈希(Hash)

 

Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

目前普遍采用的哈希算法是time33,又称DJBX33A (Daniel J. Bernstein, Times 33 with Addition)。这个算法被广泛运用于多个软件项目,Apache、Perl和Berkeley DB等。对于字符串而言这是目前所知道的最好的哈希算法,原因在于该算法的速度非常快,而且分类非常好(冲突小,分布均匀)。

PHP内核就采用了time33算法来实现HashTable,来看下time33的定义:

hash(i) = hash(i-1) * 33 + str[i]


有了定义就容易实现了:

 

 

 

<?php
function myHash($str) {
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PHPhash 算法是指将任意长度的输入数据通过一系列的数学运算转换为固定长度的输出数据的算法。这种转换称为哈希。哈希算法常用于密码加密、数据校验、数据存储等场合。 PHP 提供了若干个内置的哈希函数,如 md5()、sha1()、hash() 等。你可以根据自己的需要选择不同的哈希函数。 例如,你可以使用 md5() 函数将一个字符串哈希为 32 位十六进制数: ``` $string = "Hello, World!"; $hash = md5($string); echo $hash; // 输出:ed076287532e86365e841e92bfc50d8c ``` 你也可以使用 hash() 函数来进行哈希,并指定使用的哈希算法: ``` $string = "Hello, World!"; $hash = hash("sha256", $string); echo $hash; // 输出:7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069 ``` 注意,哈希算法是不可逆的,即无法通过哈希值推出原始数据。因此,哈希算法常用于密码加密,将用户的密码哈希后存储,以保证密码的安全。 ### 回答2: PHP中的哈希算法用于将一段任意长度的数据转化为固定长度的哈希值。哈希算法是一种单向函数,即无法从哈希值还原出原始数据。PHP提供了多种哈希算法供开发者选择,例如MD5、SHA1、SHA256等。 PHP中的哈希算法可以用于许多应用场景,其中最常见的是密码存储和数据完整性验证。在密码存储方面,通常使用的是带有“盐值”的哈希算法。盐值是一个随机生成的字符串,它与要存储的密码一起进行哈希运算。这样即使两个用户使用相同的密码,由于盐值的不同,最终生成的哈希值也是不同的,从而增加了密码的安全性。 在数据完整性验证方面,哈希算法可以用于验证数据的一致性。例如,当用户下载文件时,服务器可以生成文件的哈希值并一起提供给用户。用户可以通过计算下载文件的哈希值并与服务器提供的哈希值进行比较,以验证文件是否完整无误。如果两个哈希值相同,那么文件的完整性就得到了保证。 在PHP中,使用哈希算法非常简单。可以使用hash()函数来调用各种哈希算法。需要注意的是,在某些情况下,特定的哈希算法可能被认为是不安全的,因此在选择哈希算法时应仔细考虑安全性需求。 总之,PHP中的哈希算法提供了一种简单而强大的方法来将数据转化为固定长度的哈希值。无论是密码存储还是数据完整性验证,哈希算法都是一种非常有用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值