有数百万个用户帐户,我想将他们的数据分发到数据库的 N 个表(user_1,user_2,...,user_N)中。用户帐号由 3~8 个字符组成。所以,我想要一个返回表后缀的函数
int getTableSuffix(String userAccount);
结果是从 1 到 N 的均匀分布。
你知道这项工作有什么便宜的哈希算法吗?
有数百万个用户帐户,我想将他们的数据分发到数据库的 N 个表(user_1,user_2,...,user_N)中。用户帐号由 3~8 个字符组成。所以,我想要一个返回表后缀的函数
int getTableSuffix(String userAccount);
结果是从 1 到 N 的均匀分布。
你知道这项工作有什么便宜的哈希算法吗?
您可以取前 1-3 个字符的 ascii 值并找到这些字符的乘积以返回您的号码。
或者,您实际上可以使用字符作为表前缀,例如。用户_AA、用户_AB等
但是,您使用什么数据库存储这些数据?在大多数现代数据库中,您应该不需要创建多个表来存储相同的数据。即使有数百万条记录。表上的良好索引应该足以解决您可能遇到的任何性能问题。
目前尚不清楚您是在寻找字符串散列函数,还是基于字符串的分区方法。
一个好的字符串散列函数使用每个字符,并考虑字符的位置。例如,djb2 使用这样的东西(伪代码):
hash = 5381
foreach (ch in str)
hash = hash * 33 + ch
无论您的哈希是什么,都使用模运算按表的数量进行分区:
table = hash % count
我建议使用数据库的内置分区功能(如果有的话)。