development

Python 2.6의 임의 문자열 (괜찮습니까?)

big-blog 2020. 10. 14. 07:59
반응형

Python 2.6의 임의 문자열 (괜찮습니까?)


나는 확장 할 수있는 파이썬에서 임의의 문자열을 생성하는 더 파이썬적인 방법을 찾으려고 노력해 왔습니다. 일반적으로 나는

''.join(random.choice(string.letters) for i in xrange(len))

긴 문자열을 생성하려면 짜증납니다.

나는 random.getrandombits에 대해 잠시 생각하고 그것을 비트 배열로 변환하는 방법을 알아 낸 다음 16 진수 인코딩합니다. 파이썬 2.6을 사용하여 문서화되지 않은 bitarray 객체를 발견했습니다. 어떻게 든 작동하게했고 정말 빨라 보입니다.

약 3 초만에 내 노트북에 50mil 임의의 문자열을 생성합니다.

def rand1(leng):
    nbits = leng * 6 + 1
    bits = random.getrandbits(nbits)
    uc = u"%0x" % bits
    newlen = int(len(uc) / 2) * 2 # we have to make the string an even length
    ba = bytearray.fromhex(uc[:newlen])
    return base64.urlsafe_b64encode(str(ba))[:leng]

편집하다

heikogerlach는 문제를 일으키는 문자 수가 홀수라고 지적했습니다. 항상 16 진수에서 짝수의 16 진수를 전송하도록 새 코드가 추가되었습니다.

이렇게 빠른 속도로 더 나은 방법이 있는지 궁금합니다.


import os
random_string = os.urandom(string_length)

URL 안전 문자열이 필요한 경우 :

import os
random_string = os.urandom(string_length).hex() 

(이 경우 random_string 길이가 string_length보다 큽니다)


때로는 uuid가 충분히 짧고 대시가 마음에 들지 않으면 언제든지 교체 할 수 있습니다 ( '-', '').

from uuid import uuid4

random_string = str(uuid4())

대시없이 특정 길이를 원하는 경우

random_string_length = 16
str(uuid4()).replace('-', '')[:random_string_length]

Python.org 1023290 버그 보고서에서 발췌 :

junk_len = 1024
junk =  (("%%0%dX" % junk_len) % random.getrandbits(junk_len *
8)).decode("hex")

또한 문제 9236431023290을 참조하십시오.


fromhex()방법은 짝수의 16 진수를 예상하는 것 같습니다 . 문자열은 75 자입니다. 마지막 요소 something[:-1] 제외됩니다 ! 사용하십시오 something[:].


마지막 예제와 관련하여 다음 수정 사항은 junk_len 값에 관계없이 줄이 짝수 길이인지 확인합니다.

junk_len = 1024
junk =  (("%%0%dX" % (junk_len * 2)) % random.getrandbits(junk_len * 8)).decode("hex")

참고 URL : https://stackoverflow.com/questions/785058/random-strings-in-python-2-6-is-this-ok

반응형