代码之家  ›  专栏  ›  技术社区  ›  grayger

将用户帐户分发到n个表

  •  1
  • grayger  · 技术社区  · 15 年前

    有数以百万计的用户帐户,我想将他们的数据分布到数据库的n个表中(user_1、user_2,…,user_n)。用户帐户由3~8个字符组成。 所以,我想要一个返回表后缀的函数

      int getTableSuffix(String userAccount);
    

    结果是从1到n的均匀分布。

    你知道这项工作有什么便宜的哈希算法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Robin Day    15 年前

    您可以获取前1-3个字符的ASCII值,并找到这些字符的乘积,以便返回您的数字。

    或者,您可以实际使用字符作为表前缀,例如用户_aa、用户_ab等。

    但是,您使用的数据库是什么?在大多数现代数据库中,不需要创建多个表来存储相同的数据。即使有数以百万计的记录。良好的表索引应该足以解决您可能遇到的任何性能问题。

        2
  •  0
  •   erickson    15 年前

    目前还不清楚您是在寻找一个字符串哈希函数,还是一个基于字符串进行分区的方法。

    一个好的字符串散列函数使用每个字符,并说明字符的位置。例如,djb2使用类似的代码(伪代码):

    hash = 5381
    foreach (ch in str) 
      hash = hash * 33 + ch
    

    无论散列是什么,都要使用modulo操作按表的数量进行分区:

    table = hash % count
    

    我建议使用数据库的内置分区功能(如果有)。