J'ai besoin de créer un ID unique (String) pour chaque enregistrement, car je développe une application qui permet aux utilisateurs d'accéder à une URL unique comme:
Le code ci-dessous fonctionne pour créer les Urlidés: P>
Format(Now, "yymmddhhmmss")
3 Réponses :
S'assurer qu'une chaîne est unique avec VBA pourrait être faite d'une manière ou d'une autre différemment. E.G., prenez la date de la date, qui est unique chaque seconde et donnez-la:
Function UniqueString32() As String Const primeNumber = 23 Application.Wait Now + #12:00:02 AM# 'waiting 2 seconds UniqueString32 = Hex(Format(Now, "YY")) _ & Hex(Format(Now, "MM")) _ & Hex(Format(Now, "DD")) _ & Hex(Format(Now, "HH")) _ & Hex(Format(Now, "NS") - primeNumber) End Function
L'utilisation du temps est une bonne idée (+1) ... mais elle nécessite ensuite une granularité de sous-milliseconde pour être fiable et doit utiliser l'heure UTC, sinon DST effectuera un ensemble complet de valeurs non unique. Je ne suis pas sûr de supprimer une valeur aléatoire de celle-ci - cela ressemble à ce que garantit i> non unicité.
Est-ce testé? Me donne débordement.
@Matheuguindon - En général, il est peut-être une bonne idée de mettre la chaîne unique à la fin de la fonction aléatoire. E.G., quelque chose comme bxd31f code> +
unique () code>. Ou même
bxd code> +
unique () code> +
31f code>, si la fonction produisant le
bxd31f code> renvoie toujours une chaîne avec 6 caractères.
Ok, mais une ficelle qui est contrainte à 6 caractères, par définition i>, ne peut éventuellement être unique en aucune façon.
@Bigben - i Get 2E9D90135E CODE> Juste coller le code.
Qu'est-ce que format (maintenant, "yymmddhms") code> retour pour vous? Renvoie quelque chose comme
200212142311 code> pour moi.
@Bigben - 20021221246.
@Vityata - ? Hexagonal (20021221246 - 181387) code> retourne débordement.
@Bigben - étrange. Je reçois une réponse normale dans la fenêtre immédiate - 4a958d2f3 code>. Mais je suis avec 64 bits Excel, si cela compte ...
Hmmm. Qui pourrait être le coupable. Je suis sur 32 bits.
@Bigben - Si vous modifiez la constante vers 181387 # code> serait-il fonctionner?
Non ça ne le fait pas. Eh tbh je ne suis pas sûr que ça vaut la peine de la peine.
@Bigben - OK. Si vous trouvez un moyen de le faire fonctionner (idk comment, probablement heex $ code> (mais je doute, n'hésitez pas à éditer.
Non, je suppose que nous traitons avec longlong code> versus
long code> ou quelque chose de ce genre ... Semblant à des bugs hexagonaux sur 32 bits avec un numéro de la taille de la taille de
20021221246 CODE>.
Comment puis-je m'assurer que l'urlide créée est unique? P> blockQuote>
Vous ne pouvez pas. Et ce ne sera pas. Regardez dans des algorithmes de hachage cryptographiquement sécurisés ... et même ces em> ne sont jamais "sécurisés" pour toujours. Remarque, le hachage est quelque chose pour lequel VBA a absolument une prise en charge intégrée, mais Vous pouvez exploiter .NET pour ce . P>
Une autre option pourrait être d'obtenir le système d'exploitation pour générer Identificateurs uniques globalement (GUID) ; ces em> seraient uniques, mais beaucoup plus longtemps qu'une poignée de personnages. P>
bonne chance! p>
Les GUID sont censés être «garantis uniques» à tous les ordinateurs. (Raymond Chen a un bon post sur celle-ci: devblogs.microsoft.com/oldnewthing / 20080627-00 /? P = 21823 )
@Tomalak à droite. 48 bits est beaucoup i> d'ordinateurs ... mais pas infini
Hé bien oui. Techniquement, le nombre de GUID est limité, mais les chances sont infinitésimales que jamais un GUID est généré deux fois. Ils sont uniques pour toutes les raisons pratiques, rien d'autre qu'une application Web nécessitant des limaces URL devrait être inquiet.
Donc, les gars, ne génèrent jamais de GUIB juste pour le plaisir de cela. Ils ne suffisent pas pour tout le monde :)
@Vityata à chaque fois qu'un GUID est généré, une étoile va supernova quelque part =)
Contrairement à .NET, vous pouvez également tirer parti de Winapi pour effectuer le cryptage / le déchiffrement. CNG est relativement facile à utiliser de VBA, et peut travailler plus vite (a un peu moins de frais généraux), ce qui est particulièrement important si vous faites une dérivation essentielle / une répétition de hachage pour faire craquer le hasch plus fort.
J'ai réussi à résoudre mon propre problème. Nous devons vérifier si l'urlid existe déjà dans la table. Le défi est que l'urlide n'est pas écrit dans la table avant que la requête soit complètement exécutée. L'utilisation de 6 des 24 caractères possibles nous donnera environ 191 millions de possibilités (24 à la puissance de 6). Comme nous n'avons besoin que de créer 5 millions d'identifiants, il y a une petite chance pour des enregistrements en double.
C'est comme ça que je l'ai fait: p>
Étape 1 - Générez une urlide aléatoire pour les 5 millions de lignes en utilisant le Code d'origine P>
Étape 2 - Identifiez les doublons et la mise à jour de NULL à l'aide de la requête ci-dessous P>
Public Function URLIDExists(URLID As String) As Boolean Dim RS1 Dim strQuery As String strQuery = "SELECT * from [URLIDs] where [URL]='" & URLID & "'" Set RS1 = CurrentDb.OpenRecordset(strQuery) If RS1.RecordCount > 0 Then URLIDExists = True Else URLIDExists = False End If Set RS1 = Nothing End Function
L'accès peut générer une colonne ID qui est garantie d'être unique par table. Quel est le problème avec l'utilisation de cela?
@Tomalak vraisemblablement l'idée est d'empêcher l'URL Spoofing (?); c'est-à-dire si je reçois un lien
url.com/12345 code>, je pourrais simplement modifier l'URL vers
url.com/12346 code> pour voir ce que je reçois et en fonction de ce que c'est Lier à, je ne voudrais pas que cela soit facile à faire. Un hachage de l'ID de la rangée pourrait fonctionner, mais ne serait pas beaucoup plus sûr. Cela dit que l'exemple de l'URL de l'OP est
http code>, alors qui sait comment la sécurité doit être sécurisée.
Dépend du type de l'application. Si le contenu est public, qui se soucie si quelqu'un vérifie une URL voisine. Si le contenu n'est pas public, les paramètres URL ne doivent pas prendre la part de l'authentification. Si le contenu est à moitié public (quoi que ce soit signifie), vous pouvez encoder le numéro dans une sorte de notation personnalisée de base-n pour le rendre un peu moins prévisible et regarder moins numériques, comme le font des raccourcisseurs de liaison.
Je pense que que i> est ce que l'OP recherche
Est-ce que cela répond à votre question? Générer une chaîne unique faite de numérique / alphabet