[python] 임의의 문자열과 임의의 16 진수를 만드는 가장 간단한 방법

다음과 같이 임의의 30 자 문자열을 만드는 가장 간단한 방법은 무엇입니까?

ufhy3skj5nca0d2dfh9hwd2tbk9sw1

그리고 다음과 같은 16 진수 30 자리 숫자?

8c6f78ac23b4a7b8c0182d7a89e9b1



답변

16 진수 출력을 위해 더 빠른 것을 얻었습니다. 위와 동일한 t1 및 t2 사용 :

>>> t1 = timeit.Timer("''.join(random.choice('0123456789abcdef') for n in xrange(30))", "import random")
>>> t2 = timeit.Timer("binascii.b2a_hex(os.urandom(15))", "import os, binascii")
>>> t3 = timeit.Timer("'%030x' % random.randrange(16**30)", "import random")
>>> for t in t1, t2, t3:
...     t.timeit()
... 
28.165037870407104
9.0292739868164062
5.2836320400238037

t3 임의 모듈을 한 번만 호출하고 목록을 작성하거나 읽을 필요가 없으며 나머지는 문자열 형식으로 수행합니다.


답변

30 자리 16 진수 문자열 :

>>> import os,binascii
>>> print binascii.b2a_hex(os.urandom(15))
"c84766ca4a3ce52c3602bbf02ad1f7"

장점은 이것이 OS에서 직접 임의성을 가져오고 random ()보다 더 안전하고 빠르며 시드 할 필요가 없다는 것입니다.


답변

Py3.6 +에서 또 다른 옵션은 새로운 표준 secrets모듈 을 사용하는 것입니다 .

>>> import secrets
>>> secrets.token_hex(15)
'8d9bad5b43259c6ee27d9aadc7b832'
>>> secrets.token_urlsafe(22)   # may include '_-' unclear if that is acceptable
'teRq7IqhaRU0S3euX1ji9f58WzUkrg'


답변

import string
import random
lst = [random.choice(string.ascii_letters + string.digits) for n in xrange(30)]
str = "".join(lst)
print str
ocwbKCiuAJLRJgM1bWNV1TPSH0F2Lb


답변

여기보다 훨씬 빠른 솔루션 :

timeit("'%0x' % getrandbits(30 * 4)", "from random import getrandbits")
0.8056681156158447


답변

참고 : random.choice(string.hexdigits)은 (소문자와 대문자 모두) string.hexdigits반환 되므로 잘못된 0123456789abcdefABCDEF결과를 얻을 수 있으므로 16 진수 ‘c’가 숫자 ‘7’보다 2 배 더 많이 나타날 가능성이 있습니다. 대신 random.choice('0123456789abcdef').


답변

다른 방법 :

from Crypto import Random
import binascii

my_hex_value = binascii.hexlify(Random.get_random_bytes(30))

요점은 다음 과 같습니다 . 바이트 값은 항상 16 진수 값과 같습니다 .