2017-08-14 1 views
-2

J'ai un code Javascript qui génère une chaîne (similaire à uuid) chaîneGénérer une chaîne formated personnalisée avec python

Ici, il est le code js:

var t = "xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxx" 
    , i = (new Date).getTime(); 
return e = t.replace(/[x]/g, function() { 
    var e = (i + 16 * Math.random()) % 16 | 0; 
    return i = Math.floor(i/16), 
    e.toString(16) 
}) 

Comment puis-je générer cette chaîne avec python?

+0

'binascii.b2a_hex (os.urandom (5))' –

+1

Les gens semblent penser que vous demandez comment générer des UUID aléatoires; vous pourriez vouloir clarifier votre question. –

+0

@Rx thx. Je pense que c'est corrigé maintenant –

Répondre

6

Utiliser la substitution régulière d'expression et le nouveau module secrets de Python 3.6 - ce n'est pas équivalent au code JavaScript car ce code Python est cryptographiquement sûr et génère moins de collisions/séquences répétitives.

Le secrets documentation says:

Le module secrets est utilisé pour générer des nombres aléatoires cryptographiquement forts appropriés pour la gestion des données telles que les mots de passe, l'authentification des comptes, des jetons de sécurité, et les secrets connexes.

En particulier, les secrets devraient être utilisés de préférence au générateur de nombres pseudo-aléatoires par défaut dans le module aléatoire, qui est conçu pour la modélisation et la simulation, et non pour la sécurité ou la cryptographie.

>>> import re 
>>> from secrets import choice 
>>> re.sub('x', 
      lambda m: choice('abdef'), 
      'xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxx') 
'5baf40e2-13ef-4692-8e33-507b-40fb84ff' 

Vous voudriez cela pour vos identifiants pour être vraiment aussi unique que possible, au lieu du Mersenne Twister MT19937random qui est -en utilisant en fait construit pour produire spécifiquement une séquence répétitive des nombres.

Pour Python 3.6 < vous pouvez faire

try: 
    from secrets import choice 
except ImportError: 
    choice = random.SystemRandom().choice 
+0

Merci. Grande réponse :) –

+0

@zaph la qualité de 'Math.random()' n'est pas garantie. De plus, seuls les bits de plus faible poids de l'heure actuelle sont utilisés dans le code JavaScript. –

+0

@zaph c.f. https://stackoverflow.com/a/3357323/918959 –

1

Python fournit UUID génération par défaut:

>>> import uuid 
>>> uuid.uuid4() 
UUID('bd65600d-8669-4903-8a14-af88203add38') 
>>> str(uuid.uuid4()) 
'f50ec0b7-f960-400d-91f0-c42a6d44e3d0' 
>>> uuid.uuid4().hex 
'9fe2c4e93f654fdbb24c02b15259716c' 
+0

Le code OP crée un UUID avec un algorithme basé sur l'heure actuelle. Ce code n'utilise pas le même algorithme. –

+0

Ce n'est pas que je voulais être mais thx de toute façon. –

1

Donc, fondamentalement, vous voulez quelques chiffres hexadécimaux aléatoires:

from random import randint 
'-'.join(''.join('{:x}'.format(randint(0, 15)) for _ in range(y)) for y in [10, 4, 4, 4, 10]) 

Où 10, 4, 4, 4, 10 sont des longueurs de chaque segment votre chaîne de format. Vous voudrez peut-être ajouter une graine, mais en gros cela fait ce que votre code JS fait, produisant des chaînes comme 'f693a7aef0-9528-5f38-7be5-9c1dba44b9'.

+0

Merci beaucoup.C'est exactement ce que je veux. –

+0

bwt, its [8, 4, 4, 4, 8] –