Générer de hachage Unique pour un champ dans SQL Server
Je suis dans le processus de rédaction d'un Fournisseur d'appartenances pour une utilisation avec notre existants effectif de base. J'utilise EF4.1 pour l'ensemble de mes accès de base de données et l'un des émis que je suis en cours d'exécution dans est lorsque la DB a été à l'origine de l'installation les relations ont été fait par programme plutôt que dans la db. Si les relations doit être effectuée sur une colonne qui n'est pas obligatoire pour tous nos utilisateurs, mais afin de rendre les relations ne doivent être uniques (à partir de ma compréhension).
Ma solution que je crois que de travailler est de faire un hachage MD5 sur le champ userid (qui est unique ...ce qui voudrait/devrait garantir une valeur unique dans ce domaine). La partie que je vais avoir des problèmes avec sql server est la requête qui ferait cela SANS avoir à remplacer les valeurs existantes stockées dans le employeeNum champ (celui en question).
Donc, en résumé, ma question est de. Quelle est la meilleure façon d'obtenir une valeur unique dans la employeeNum
champ (éventuellement sur la base d'un hash md5 de la userid
champ) sur toutes les lignes dont la valeur n'est pas déjà présent. Aussi, pour un mineur/majeur mesure...est-ce son comme un bon plan?
Je suis conscient des différences entre eux/possible/collision/etc, j'ai énumérés MD5 en raison de la taille de la table de hachage, mais à la fin de la journée, je ne suis pas vraiment préoccupé par le hachage utilisé, seulement qu'une valeur unique est généré. Une valeur de hachage doit accomplir cela, lorsqu'il est basé sur un nom d'utilisateur (qui est unique). Nous avons un PETIT (90 ish) de l'appartenance à la base, mais certains d'entre eux sont des vendeurs...qui est ce qui m'a amené à ne pas passer à l'asp, fournisseur d'appartenances. Donc en bref, je suis conscient de la petite domaine de collision MD5, mais je ne suis pas du tout ensemble, inquiète beaucoup.
Donc, si vous êtes au courant de la possibilité de collision avec MD5, et sont toujours prêts à l'utiliser pour générer de "l'unique" des valeurs (qui peut ne pas être unique), pouvez-vous décrire plus précisément ce que tu veux dire par "meilleur"? Aussi pouvez-vous expliquer pourquoi vous avez besoin d'une valeur de hachage de l'id d'utilisateur au lieu de simplement le nom d'utilisateur?
la possibilité d'une collision avec 250ish enregistrements (en supposant que notre base d'adhésion gonfle) et un hachage générés dans des < 50% d'entre eux AU PLUS (hachage utilisé uniquement pour les fournisseurs) est très éloignée. Comme je l'ai dit si je ne suis pas pointilleux sur QUI de hachage est utilisée. J'ai énuméré MD5 dû à la plus petite de hachage de taille et parce que le hash n'est pas utilisé pour la sécurité, mais plutôt utilisé pour son caractère unique.
Toute chance que vous pouvez démarrer sur le bon modèle de données? EF ne devrait pas être pointé sur une colonne nullable pour l'unicité. Pourquoi ne peut-il pas utiliser l'identifiant de la relation au lieu de l'option employeeNum?
OriginalL'auteur Jared | 2012-06-08
Vous devez vous connecter pour publier un commentaire.
Si votre question est juste comment générer une valeur de hachage pour l'identifiant, vous pouvez le faire de cette façon en utilisant une colonne calculée (ou générer cette valeur dans le cadre de l'insert). Il n'est pas clair pour moi si vous savez à propos de la HASHBYTES de fonction ou de ce que d'autres critères que vous êtes en train de regarder quand vous dites "le mieux".
Résultats:
Dans SQL Server 2012, je vous recommande vivement au moins SHA2_256 au lieu de l'un des ci-dessus. (Vous avez oublié de mentionner que la version que vous utilisez toujours des informations utiles.)
Tout ce que dit, j'ai encore envie d'appeler l'attention sur la remarque que j'ai faite dans les commentaires: la "meilleure" solution ici est de corriger le modèle. Si
employeeNum
est facultatif, EF ne devrait pas être faite à penser qu'il est nécessaire ou unique, et il ne devrait pas être utilisé dans des relations si elle n'est pas, en fait, une sorte d'identifiant. Pourquoi un utilisateur de soins sur les collisions entreemployeeNum
etuserid
si vous utilisez le droit de l'attribut de la relation en premier lieu?MODIFIER comme demandé par l'OP
Donc quel est le problème avec le fait de dire
UPDATE table SET EmployeeNum = 1000000 + UserID WHERE EmployeeNum IS NULL
? SiEmployeeNum
restera ci-dessous1000000
alors vous avez la garantie pas de collisions et vous avez évité de hachage tout à fait.Vous pourriez générer des rembourrage si
employeeNum
peut contenir une chaîne de caractères, mais encore une fois est EF qui promeut ces horribles noms de colonne? Pourquoi une colonne avec unNum
suffixe contenir n'importe quoi, mais un certain nombre?Aussi quelles que soient les modifications que je fais aujourd'hui aura également une modification des Procédures Stockées de sorte que toutes les nouvelles entrées contiennent les mêmes changements. L'application qui utilise cette relation particulière ne sera même pas encore utilisé, mais j'ai besoin d'obtenir les relations définies dans la base de données pour que je puisse écrire le fournisseur d'appartenances. Je vais très probablement modifier la db pour la carte d'un utilisateur à un rôle au lieu d'une "application" comme je l'ai ré-écrire les applications dans MVC3 au lieu de asp.net des pages.
il ne contiendra qu'une lettre si c'est un employé spécifique "type", mais il est toujours considéré comme leur numéro d'employé qui est pourquoi nous avons nommé le terrain comme nous l'avons fait. Alors que la signification littérale du nom de la colonne n'aurait pas de sens pour la plupart. Il ne fait sens pour quelqu'un à l'intérieur de la société qui est pourquoi il a été laissé à la façon dont elle était. C'est un nom qu'ils ont utilisé sur le mainframe pour les+ de 20 ans et ne sera probablement pas être changé n'importe quand bientôt :S
OriginalL'auteur Aaron Bertrand
Vous pouvez également utiliser un uniqueidentifier la valeur par défaut pour (newid())
Créer une nouvelle colonne EmployeeNum que uniqueidentifer, puis:
Alors définie comme clé primaire.
ABS(CHECKSUM(NEWID())
... mais encore une fois, ne pas éviter les collisions avec les existants EmployeeNum valeurs.OriginalL'auteur Gordon Bell
Est-il même pas besoin d'être un hash? Si vous avez seulement 250 enregistrements pouvez-vous mettre à jour employeenum à l'égalité de nom d'utilisateur, ou 1000 + nom d'utilisateur?
Je suis d'accord @Russell, je ne suis pas sûr de comprendre pourquoi le hachage doit être là, soit.
J'ai expliqué mon raisonnement dans les commentaires du post original.
si je pense toujours que les valeurs de hachage ne sont pas nécessaires, pensez-vous, vous m'avez convaincu?
OriginalL'auteur Russell Fox