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")
또한 문제 923643 및 1023290을 참조하십시오.
이 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
'development' 카테고리의 다른 글
React-Redux : 모든 구성 요소 상태가 Redux Store에 유지되어야 함 (0) | 2020.10.14 |
---|---|
MATLAB에서 n 차원 행렬의 각 요소를 어떻게 반복합니까? (0) | 2020.10.14 |
std :: vector를 선언 할 수없는 이유 (0) | 2020.10.14 |
Spring-빈 초기화를 위해 정적 최종 필드 (상수) 사용 (0) | 2020.10.14 |
Clojure-명명 된 인수 (0) | 2020.10.14 |