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