C++ 一个好的重新划分算法

C++ 一个好的重新划分算法,c++,algorithm,memcached,C++,Algorithm,Memcached,我正在实现一个客户端库。我希望它能够支持多台服务器,因此我希望添加一些负载平衡系统 基本上,您可以在服务器上执行两个操作: 根据键存储值 根据键获取值 假设我有N服务器(从0到N-1),我希望有一个重新分区功能,根据给定的键和服务器编号N,可以给我[0,N[范围内的索引 unsigned int getServerIndex(const std::string& key, unsigned int serverCount); 该功能应尽可能快速和简单,并且必须遵守以下约束条件: g

我正在实现一个客户端库。我希望它能够支持多台服务器,因此我希望添加一些负载平衡系统

基本上,您可以在服务器上执行两个操作:

  • 根据
    键存储
  • 根据
    键获取
假设我有
N
服务器(从
0
N-1
),我希望有一个重新分区功能,根据给定的
键和服务器编号
N
,可以给我
[0,N[
范围内的
索引

unsigned int getServerIndex(const std::string& key, unsigned int serverCount);
该功能应尽可能快速和简单,并且必须遵守以下约束条件:

getServerIndex(key, N) == getServerIndex(key, N); //aka. No random return.
我希望我能在不使用外部库(如
OpenSSL
及其散列函数)的情况下完成这项工作。我的选项是什么


旁注:

显然,基本实施:

unsigned int getServerIndex(const std::string& key, unsigned int serverCount)
{
  return 0;
}
不是有效答案,因为这不是一个好的重新分区功能:D


其他信息:

键通常是ANSI字符集内任何可能的字符串(主要是
[a-zA-Z0-9_-]
)。大小可以是从一个字符键到您想要的任何大小


对于两个不同的密钥,good重新分区算法是一种返回
A
的概率与返回
b
的概率相等(或不太远)的算法。服务器的数量可能会发生变化(但很少发生变化)如果是这样,那么对于给定的
返回的索引也可以更改

hash(key) % serverCount

像这样简单的事情怎么样

hash(key) % serverCount

我认为散列方法是正确的想法。有许多简单的散列算法

随着即将推出的C++0x和新标准的
无序映射
,字符串的
散列
正在成为一种标准操作。许多编译器已经提供了一个版本的STL,该版本具有
散列映射
,因此已经预先实现了
散列
函数

我会从这些开始…但如果我们有更多关于字符串的信息会更好:它们是否以某种方式被限制在有限的字符集内,或者它们可能是许多相似的字符串

问题是,如果输入一开始不是均匀分布的,那么“标准”散列可能不会产生均匀分布

编辑


考虑到这些信息,我认为大多数STL附带的哈希函数应该可以工作,因为您似乎没有一个高度集中的区域。不过,我现在是概率方面的专家,所以对此持保留态度(并进行实验).

我认为哈希方法是正确的想法。有许多简单的哈希算法

随着即将推出的C++0x和新标准的
无序映射
,字符串的
散列
正在成为一种标准操作。许多编译器已经提供了一个版本的STL,该版本具有
散列映射
,因此已经预先实现了
散列
函数

我会从这些开始…但如果我们有更多关于字符串的信息会更好:它们是否以某种方式被限制在有限的字符集内,或者它们可能是许多相似的字符串

问题是,如果输入一开始不是均匀分布的,那么“标准”散列可能不会产生均匀分布

编辑


考虑到这些信息,我认为大多数STL附带的哈希函数应该可以工作,因为您似乎没有一个高度集中的区域。不过,我现在是概率方面的专家,所以对此持保留态度(并进行实验).

您可能正在寻找能够实现的东西。最简单的方法是为每个memcache服务器分配一个随机ID,并按照某种标准将每个项分配给memcache服务器,该服务器的ID与项的哈希值最接近

一个常见的选择是使用SHA1散列函数(尽管散列并不重要),这也是分布式系统(如)所采用的方法,并通过将项目的哈希值与服务器的哈希值进行XOR运算并将结果解释为大小来比较距离。那么,您所需要的只是一种让每个客户端都知道memcache服务器列表及其ID的方法


当memcache服务器加入或离开时,它只需要生成自己的随机ID,然后让它的新邻居向它发送与其哈希值更接近的项目。

您可能正在寻找实现的项目。最简单的方法是为每个memcache服务器分配一个随机ID,然后将每个项目分配给memcache服务器,其ID与项的哈希值最接近(按某种度量)

一个常见的选择是使用SHA1散列函数(尽管散列并不重要),这也是分布式系统(如)所采用的方法,并通过将项目的哈希值与服务器的哈希值进行XOR运算并将结果解释为大小来比较距离。那么,您所需要的只是一种让每个客户端都知道memcache服务器列表及其ID的方法


当memcache服务器加入或离开时,它只需要生成自己的随机ID,然后让它的新邻居向它发送与其哈希值更接近的任何项目。

定义“良好”的重新分区函数。serverCount是非常动态的还是在一次运行时会非常静态?@KillianDS:在完美的情况下,它将l不会改变。但是可能会发生一些服务器“死亡”(从某个时间开始),然后返回的索引会改变,这是完全可以接受的。定义“良好”的重新分区函数。serverCount是非常动态的还是在一次运行时会非常静态?@Killi