9
votes

Cutdown Uuid plus loin pour faire une chaîne courte

Je dois générer une carte d'enregistrement unique pour la chaîne unique donnée.

J'ai essayé d'utiliser un format UUID qui semble être bon.

Mais nous pensons que cela est longuement.

Nous devons donc dépenser la chaîne UUID 9F218A38-12CD-5942-B877-80ADC0589315 à plus petite. En supprimant '-' Nous pouvons économiser 4 caractères. Quelle est la partie la plus sûre à supprimer de UUID? Nous n'avons pas besoin d'une pièce d'identité universellement unique, mais nous aimons utiliser UUID comme source mais couper des chaînes.

Nous avons besoin d'une carte d'identité unique spécifique à Site / Base de données (Services de données SQL Server / Ado.net).

Une idée ou un échantillon de n'importe quelle langue est bien

Merci d'avance


0 commentaires

5 Réponses :


9
votes

Pourquoi pas plutôt le convertir à une chaîne de base 64? Vous pouvez le couper jusqu'à 22 caractères de cette façon.

stocker uuid comme base64 string


0 commentaires

3
votes

Si vous utilisez MS-SQL, vous devez probablement simplement utiliser le type de données CompactDenifier, il s'agit à la fois compact (16 octets) et, puisque le moteur SQL le sait, il peut optimiser les index et les requêtes en l'utilisant.


2 commentaires

Un UUID est également de 16 octets, donc cela ne le rend pas plus petit du tout.


GLENN, OBTENINDENTIFIER == UUID, mais l'OP n'allait certainement pas de la stocker comme une chaîne.



0
votes

Un UUID a 128 bits. Avez-vous envisagé de faire une CRC de cela? Cela pourrait le faire passer à 16 ou 32 bits facilement et utiliserait toutes les informations originales. Si un CRC n'est pas assez bon, vous pouvez toujours utiliser les premiers octets d'un hachage approprié (SHA256, par exemple).

Si vous voulez vraiment simplement réduire l'UUID, le format est décrit dans RFC 4122 . Vous devriez être capable de comprendre quelles parties votre implémentation n'a pas besoin de cela.


3 commentaires

Dépend de la quantité d'unicité dont il a besoin. C'est pourquoi j'ai suggéré à la fois CRC et une alternative.


Malheureusement, vous ne pouvez pas réduire les bits bruts de l'UUID sans enlever son statut d'UUID. En effet, il faut que 128 bits de hasard soient considérés comme une UUID et de réduire suffisamment la possibilité d'une collision à proximité de zéro.


Il n'en a pas besoin pour être un UUID. Il a besoin que cela soit un ensemble de bits (localement).



2
votes

Un UUID fournit (presque) 128 bits d'unicité. Vous pouvez la raccourcir à 16 octets binaires, ou 22 caractères codés de base64. Je ne recommanderais pas de supprimer une partie d'une UUID, sinon, cela perd seulement son sens. Les uuids ont été conçus pour que tous les 128 bits aient une signification. Si vous voulez moins que cela, vous devez utiliser un autre schéma.

Par exemple, si vous pouvez garantir que seules les Uuids de la version 4 sont utilisées, vous pouvez prendre uniquement les 32 premiers bits, ou les 32 derniers bits. Vous perdez un caractère unique, mais vous avez des nombres assez aléatoires. Évitez simplement les bits qui sont fixes (version et variante).

Mais si vous ne pouvez pas vous garantir cela, vous aurez de vrais problèmes. Pour les uuids de la version 1, les premiers bits ne seront pas uniques pour les uuids générés le même jour et les derniers bits ne seront pas uniques pour les UUID générées dans le même système. Même si vous cédez l'UUID, il n'est pas garanti que vous auriez 16 ou 32 bits d'unicité.

Dans ce cas, utilisez simplement un autre système. Générez un numéro aléatoire 32 bits à l'aide du générateur de nombres aléatoires du système et utilisez-le comme votre identifiant unique. Ne comptez pas sur Uuids si vous avez l'intention de décaper sa longueur.


0 commentaires

2
votes

L'UUID est de 128 bits ou 16 octets. Sans encodage, vous pouvez l'obtenir aussi bas que 16 octets. Les uuids sont généralement écrits en hexadécimal, ce qui en fait des chaînes lisibles de 32 octets. Avec d'autres codages, vous obtenez différents résultats:

  1. base-64 tourne 3 octets de 8 bits en 4 caractères 6 bits, de sorte que 16 octets de données deviennent 22 caractères de long
  2. base-85 tourne 4 octets de 8 bits en 5 caractères 6,4 bits, de sorte que 16 octets de données deviennent 20 caractères de long

    Tout dépend de si vous souhaitez des chaînes lisibles et de la manière dont vous souhaitez utiliser standard / commun.


0 commentaires