将10位char用户ID分配给1000台服务器中的1台

时间:2009-11-23 20:12:15

标签: php hash sharding

希望对数据库进行分片,并根据用户ID将不同的用户分配给不同的主服务器。用户ID是10个字符的字符串,例如“f4gKUKkj91”...每个服务器的ID为1 - 1000.如何在php中创建一个哈希函数,以便唯一且一致地将每个用户ID分配给特定的分片?如果用户id是一个整数,我可以做userid % 1000 ...但由于它们是字母数字,我不知道如何在php中进行均匀分布。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用crc32(),它会为您提供字母数字用户ID的数字哈希值。

答案 1 :(得分:1)

这不是一个完美的算法,因为稍微偏爱较小的ID号。假设用户ID相当均匀地分布,可以这么说;如果他们不是,分配可能不会很好。

弄清楚你的字母是什么,并把它放在像$str = '0123456789abcdefghijklmnopqrstuvwxxyzABCDEFGHIJKLMNOPQRSTUVXYZ';这样的字符串中。这个字符串有 n 个字符。现在,我们将基本上将用户ID视为基本 n 整数。

对于每个字符,在字符串中查找其索引(从0开始)。取这个索引并乘以n x ,其中x是原始字符串中的字符位置,从0开始。将所有这些加在一起,并取总和的模数。

你可能只想为几个字符执行此操作 - 一旦你读了几个字符,总和会变得​​很大,并且PHP无法正确处理它,除非你求助于使用适合大整数数学的函数(你当然可以使用GMP等,但它可能不适合你的情况)。如果使用原始整数,则在最大可能总和超过2 ^ 31(n x + n x + 1 + ... + n)之前停止。

您可以使用从开头开始或向后(向后对应通常的整数表示法)。其中一个可能更合适,具体取决于ID生成的工作方式。