프로젝트를 진행하다 보면, 랜덤 값이 필요한 경우가 많이 생긴다.
특히 보안이 필요하다면 더욱 더...
암호화 된 값들과 해쉬 값들, 그리고 그것들로 위장한 의미 없는 값들...
단순한 인덱싱 조차도 1, 2, 3, 4, 5, ... 로 사용하는 것이 허용되지 않기도 한다.

다양한 케이스에서 랜덤값이 필요하게 되면서 알게된 것이 두 가지가 있다.
첫째는 python의 기본 random 모듈로는 요구 사항을 만족 시킬수 없는 부분이 있다.
둘째는 기본 random 모듈 이외에 추가적인 좋은 방법들이 있다.

그래서 이번에 사용한 방법들을 정리하고자 한다.

본인은 현재 '열혈강의 파이썬 개정판: 이강성저'를 참고서적으로 보고 있으며,
아래의 정리 내용은 책에 없는 내용만을 포함하고 있다.
아래 방법들을 사용하기에 앞 서
책에서 기본적인 내용을 우선 읽어보기를 권하는 바이다. 


1. random 모듈 [문서]

>>> import random
>>> import string
>>> c = string.letters + string.digits
>>> c
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
>>> v = ''.join(random.sample(c, 6))
>>> v
'yxEeLl' 


2. uuid 모듈 [문서]

세부적인 사항은 문서 링크를 참고하면 된다.
단순히 적당한 길이의 random 문자열이 필요하다면, 아래의 코드도 괜찮은 선택이다.

>>> import uuid
>>> uuid.uuid1()
UUID('8f9f01b8-923e-11e0-889b-1093e9020660')
>>> str(uuid.uuid1())
'98c3d57a-923e-11e0-ae95-1093e9020660'
>>> uuid.uuid4() 
UUID('6a81a0ca-dcfc-4024-883e-5abb29238b4d')
>>> str(uuid.uuid4()) 
'7ed3f7b9-84a5-4066-8e9c-e5e1bc370573' 


3. os 모듈의 urandom

os 모듈에는 urandom이라는 함수가 있다.
이 함수는 원하는 길이(byte단위)의 unsigned 수치값을 만들어 준다.
물론 int 형이나 long 형이 아니기 때문에 약간의 가공이 필요할 수 있다.
아래 방법은 암호화 알고리즘의 키를 생성하는데 유용하다.

>>> import os
>>> import binascii
>>> os.urandom(16)
'h\xb4\xaa<\x12\xa5\xc8\xaf\xa2sCr\x93\x01f\xdc'
>>> binascii.hexlify(os.urandom(16))
'7a26ada27ace29eb422c04efe7313526'
>>> int(binascii.hexlify(os.urandom(16)), 16)
69812220901636122490437131090184792388L 

|

ghilbut's Blog is powered by Daum & tistory