2009-05-05 8 views
1

Il existe des millions de comptes utilisateur et je souhaite distribuer leurs données dans N tables (utilisateur_1, utilisateur_2, ..., utilisateur_N) d'une base de données. Les comptes d'utilisateur sont composés de 3 ~ 8 caractères. Donc, je veux une fonction qui renvoie le suffixe de table commeRépartition des comptes utilisateur sur N tables

int getTableSuffix(String userAccount); 

Le résultat est une distribution uniforme de 1 à N.

Connaissez-vous un algorithme de hachage pas cher pour ce travail?

+2

Vous utilisez le partitionnement de base de données intégré (de SQL Server, Oracle, et probablement la plupart des autres), j'espère? –

+0

Pourquoi voulez-vous les distribuer dans des tables séparées? –

+0

@lassevk: Je m'inquiète qu'une grande table puisse souffrir du verrouillage de table dans des situations en utilisant MyISAM de MySQL. – grayger

Répondre

1

Vous pouvez prendre la valeur ASCII des 1-3 premiers caractères et trouver un produit de ceux-ci afin de retourner votre numéro. Vous pouvez également utiliser les caractères comme préfixe de table, par exemple. Users_AA, Users_AB, etc.

Cependant, quelle base de données utilisez-vous pour ces données? Dans la plupart des bases de données modernes, vous ne devriez pas avoir besoin de créer plusieurs tables pour stocker les mêmes données. Même avec des millions d'enregistrements. Une bonne indexation sur votre table devrait être plus que suffisante pour résoudre les problèmes de performance que vous pourriez avoir.

0

Il n'est pas clair si vous recherchez une fonction de hachage de chaîne ou une méthode de partitionnement basée sur des chaînes. Une bonne fonction de hachage de chaîne utilise chaque caractère et tient compte de la position des caractères. Par exemple, djb2 utilise quelque chose comme ça (pseudo-code):

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

Quel que soit votre hachage est, partition par le nombre de tables à l'aide d'une opération modulo:

table = hash % count 

je recommande via le haut- dans la capacité de partitionnement de votre base de données, s'il en a un.

Questions connexes