0
votes

VBA générant une chaîne alphanumérique unique aléatoire

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:

http://url.com/bxd31f p>

Le code ci-dessous fonctionne pour créer les Urlidés: P>

 Format(Now, "yymmddhhmmss")


5 commentaires

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 , je pourrais simplement modifier l'URL vers url.com/12346 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 , 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 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


3 Réponses :


1
votes

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


14 commentaires

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 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 + unique () . Ou même bxd + unique () + 31f , si la fonction produisant le bxd31f renvoie toujours une chaîne avec 6 caractères.


Ok, mais une ficelle qui est contrainte à 6 caractères, par définition , ne peut éventuellement être unique en aucune façon.


@Bigben - i Get 2E9D90135E Juste coller le code.


Qu'est-ce que format (maintenant, "yymmddhms") retour pour vous? Renvoie quelque chose comme 200212142311 pour moi.


@Bigben - 20021221246.


@Vityata - ? Hexagonal (20021221246 - 181387) retourne débordement.


@Bigben - étrange. Je reçois une réponse normale dans la fenêtre immédiate - 4a958d2f3 . 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 # 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 $ (mais je doute, n'hésitez pas à éditer.


Non, je suppose que nous traitons avec longlong versus long 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 .



2
votes

Comment puis-je m'assurer que l'urlide créée est unique?

Vous ne pouvez pas. Et ce ne sera pas. Regardez dans des algorithmes de hachage cryptographiquement sécurisés ... et même ces 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 .

Une autre option pourrait être d'obtenir le système d'exploitation pour générer Identificateurs uniques globalement (GUID) ; ces seraient uniques, mais beaucoup plus longtemps qu'une poignée de personnages.

bonne chance!


6 commentaires

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 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.



0
votes

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


0 commentaires