Générer des id unique de unique de chaîne d'entrée
J'ai une table avec une colonne de l'unique chaîne de valeurs. La longueur maximum de la chaîne de valeur de 255 caractères. Je veux générer un id unique avec la valeur de la chaîne en entrée. En d'autres mots, je suis à la recherche d'une représentation compacte d'une chaîne. L'id unique généré peut être alpha-numérique. Une caractéristique utile d'avoir serait d'être en mesure de régénérer la chaîne de valeur de l'id unique.
Est-il un fonctionnement efficace pour générer un tel identifiant unique. Certains égards, pourrait être à l'aide de la somme de contrôle ou de fonctions de hachage. Je veux savoir si il existe un moyen standard pour ce faire.
Je suis en utilisant la base de données MySql et java.
Merci!
--edit: je suis à la recherche d'une représentation plus compacte, plutôt que de simplement en utilisant la chaîne elle-même.
Pourquoi ne pas utiliser un UUID à la place? stackoverflow.com/questions/192920/...
OriginalL'auteur pkrish | 2010-02-03
Vous devez vous connecter pour publier un commentaire.
Unique est "unique"? À l'aide de toute bonne fonction de hachage (MD5 est correct pour la plupart des utilisations, et facilement mis en œuvre par java.de sécurité.MessageDigest.getInstance("MD5"), vous pouvez obtenir un nombre de 128 bits, ce qui est très très susceptible d'être unique. À l'aide d'un sous-ensemble de la table de hachage vous procure un plus petit diamètre, avec une chance plus élevée de la collision.
À l'aide d'un champ de type auto_increment dans la DB, si cela correspond à votre conception, peut-être plus facile à mettre en œuvre, assurer l'unicité, et d'utiliser des petites Id que les 16 octets de MD5. Vous pouvez également répondre à votre exigence de trouver la chaîne de la clé, ce qui vous ne pouvez pas le faire pour une table de hachage.
OriginalL'auteur Dagon
Ceci est lié à la compression. La façon la plus simple serait de peu-pack et obtenir de chaque personnage vers le bas pour que le strict minimum en nombre de bits.
A-Z est de 26 caractères qui est inférieur à 32 (5 bits)
ajouter un-z et il est à 6 bits (avec quelque part autour de 12 bits-modèles pour représenter d'autres caractères).
Disons que c'est assez pour vous. Si vous avez 6x255 bits qui est 1530 bits pour stocker votre chaîne. (191 octets)
Va avec uniquement des capuchons permettrait de réduire un peu (à 159 octets)
Vous pouvez l'optimiser plus, mais alors vous devez aller dans un algorithme de compression qui s'attend à une langue spécifique ou motifs dans les Cordes et optimise ces modèles.
Sauf si vous pouvez préciser le contenu des chaînes de caractères, vous êtes tout simplement pas à obtenir ce que vous voulez. Désolé. (Si vous pouvez en dire plus sur le contenu de ces chaînes, le faire. L'un de nous peut voir des modèles qui permettront à beaucoup mieux "Compression")
Ce manque de capacité à faire ce que vous voulez, c'est pourquoi les tables de hachage sont tellement cool. Ils obtiennent une "de la Plupart Unique" nombre et ensuite une deuxième niveau de la résolution de tester les cas où les deux chaînes hachées pour le même nombre.
OriginalL'auteur Bill K
Si votre base de données nécessite que la colonne contient des valeurs uniques, alors pourquoi ne pas utiliser la chaîne elle-même? Autre chose c'est juste une autre étape pour encoder/décoder.
Ah ok, donc une compression sans perte d'une chaîne, de sorte que vous n'avez pas besoin d'afficher l'ensemble de 255 caractères? Avez-vous regardé dans la compression ZIP?
OriginalL'auteur FrustratedWithFormsDesigner
Vous avez beaucoup beaucoup plus de possibilités pour un 255 long de la chaîne de 64 (ou autre) peu long. C'est impossible. Ajouter un champ de type auto_increment.
OriginalL'auteur Notinlist
Depuis que vous utilisez MySQL, jetez un oeil à CRC32
http://www.bitbybit.dk/carsten/blog/?p=191
OriginalL'auteur philfreo
À moins que l'ID a d'autres contraintes que "être unique".
OriginalL'auteur Sean
Si vous avez un nombre limité de chaînes qui se produisent fréquemment, la création d'une table de référence avec un numérique (auto-increment) ID, et un FK pour que la table de référence dans votre table principale pourrait être une option.
Si pas, vous pouvez exécuter vos chaînes avec GZIP ou tout autre algorithme de compression si vous avez besoin de récupérer l'original.
Si vous n'avez pas besoin de récupérer l'original, une fonction de hachage telle que MD5 est ce que vous cherchez.
OriginalL'auteur Henning
Choisir la bonne clé ne devrait pas être prise facile.
Vous devez tenir compte:
De réplication:
C'est le partage de clés entre les différents serveurs nécessaires? Si donc, vous avez probablement besoin d'une sorte de hachage unique, ou le guid.
Taille de la table/nombre de plaquettes:
Vous devriez noter que la plupart des sgbdr stocker les données physiquement sur le disque dur par l'ordre de leur (cluster) de la clé primaire. Maintenant, imaginez ce qui se passe, si vous insérez une valeur de hachage commençant par 'a' sur un tableau avec une taille raisonnable. Oui, il y a l'indice de rembourrage, mais finalement son plein et la seule ligne insérez peut provoquer le déplacement d'un couple de GO sur le disque dur.
Besoin de réplication ET ont de grandes tables?
Utiliser les deux. L'utilisation d'un primaire cluster auto incrément entier (long)de la clé et de définir un index unique sur votre hash colonne.
OriginalL'auteur Michael Sander