Générer efficacement des 16 caractères chaîne alphanumérique
Je suis à la recherche d'un moyen très rapide de générer un alphanumériques identifiant unique pour une clé primaire dans une table.
Serait quelque chose comme ce travail?
def genKey():
hash = hashlib.md5(RANDOM_NUMBER).digest().encode("base64")
alnum_hash = re.sub(r'[^a-zA-Z0-9]', "", hash)
return alnum_hash[:16]
Ce serait une bonne façon de générer des nombres aléatoires?
Si je me base sur microtime, je dois tenir compte de la possibilité de plusieurs appels de genKey() en même temps, à partir de différentes instances.
Ou est-il une meilleure façon de faire tout cela?
Vous devez vous connecter pour publier un commentaire.
Comme aucune réponse à vous fournir un hasard chaîne composée de caractères 0-9, a-z, A-Z: Voici une solution de travail qui vous donnera environ. 4.5231285 e+74 clés:
Il est également très lisible sans le savoir des codes ASCII par cœur.
Il y a une version plus courte depuis
python 3.6.2
:Vous pouvez utiliser ceci:
Il n'y a aucune garantie que les clés générées seront unique de sorte que vous devez être prêt à réessayer avec une nouvelle clé dans le cas de l'insertion d'origine échoue. Aussi, vous pouvez envisager d'utiliser un algorithme déterministe pour générer une chaîne de caractères à partir d'une auto-incrémenté id au lieu d'utiliser des valeurs aléatoires, comme cela vous garantie de l'unicité (mais il donnera également prévisible touches).
os.urandom
pas pseudo-aléatoire?os.urandom
est encore pseudo-aléatoire, mais cryptographique sécurisé pseudo-aléatoire, ce qui le rend beaucoup plus approprié pour un large éventail de cas d'utilisation par rapport àrandom
.get_key = lambda n: n % 10
est déterministe, mais pas unique pour longtemps.Ont un look à la uuid module (Python 2.5+).
Un exemple rapide:
Noter que l'OP a demandé de 16 caractères alphanumériques de la chaîne, mais UUID4 chaînes de 32 caractères de long. Vous ne devriez pas tronquer cette chaîne, au lieu de cela, utiliser la totalité de 32 caractères.
De nombres aléatoires est une bonne source
os.urandom
:''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(6666))
En Python 3.6, publié en décembre 2016, le
secrets
module a été introduit.Vous pouvez maintenant générer un jeton aléatoire de cette façon :
De l'Python docs :
https://docs.python.org/3/library/secrets.html
Cette valeur est incrémentée de 1 à chaque appel (il s'enroule autour). Décider de l'endroit où le meilleur endroit pour stocker la valeur dépendra de la façon dont vous l'utilisez. Vous pouvez trouver cette explication de l'intérêt, comme il l'explique non seulement comment les Guid de travail, mais aussi comment faire une plus petite.
La réponse est:
L'utilisation de certains de ces personnages que l'horodatage et les autres personnages comme un "uniquifier," une valeur s'incrémente de 1 à chaque appel à votre uid générateur.
simplement utiliser python intégré uuid :
Simplement utiliser python builtin uuid:
Si Uuid sont d'accord pour vous à utiliser le construit en uuid paquet.
Une Solution En Ligne: