0

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

谢谢!

4

2 回答 2

3

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

于 2009-11-23T20:30:17.987 回答
1

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

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

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

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

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

于 2009-11-23T20:31:35.147 回答