2014-09-25 2 views
6

내가 원하는 것은 내 웹 사이트에서 내 사용자에게 크기 5의 문자열 (키)을 생성하는 것입니다. BBM PIN과 더 비슷합니다.Python/Django에서 고유 한 문자열 생성

숫자와 대문자 영어 문자가 포함됩니다 키 : 나는 또한에 대한 정지 할 수있는 방법을

  • AU1B7
  • Y56AX
  • M0K7A

을 내가 문자열을 mi로 생성하더라도 문자열의 고유성 llions?

가능한 가장 비옥 한 방법으로 어떻게 할 수 있습니까?

+0

'base64.b32encode ('12345') == 'GEZDGNBV' ' –

+1

또한 https://github.com/jbittel/base32-crockford –

+1

당신은'django.utils.crypto.get_random_string (5 , string.ascii_uppercase + string.digits)'를 참조하십시오. 특정 글꼴에서 읽을 수없는 'llIll'과 같이 잠재적으로 혼란스러운 문자열을 생성하지 않도록 문자 집합을 제한하고자 할 수 있습니다. 고유성은 할당 된 문자열 집합을 유지해야 할 것입니다. – mhawke

답변

12

내 좋아하는

import uuid 
uuid.uuid4().hex[:6].upper() 
입니다

django를 사용하는 경우이 필드에서 고유 한 제한을 설정하여 고유해야합니다. https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.unique

+0

+1입니다. 그러나 나는 당신이 어떻게 고유 한 가치를 창출하고 있는지 확신하고 있는지 궁금했다. 반복되는 값을 생성하지 않습니까? –

+0

물론 충돌이있을 수 있습니다! http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates 충돌 기회가 더 오래있을수록 더 날씬합니다. 기본적으로 모든 로직을 생성하고 저장하는 방법에 대한 설명이 필요하기 때문에 더 많은 논리가 필요합니다. – zzart

+2

알파 문자가 A..F로 제한되므로 AU1B7, Y56AX 또는 M0K7A가 생성되지 않습니다. 보장 된 고유 값을 생성하지는 않습니다. 충돌을 처리하는 방법을 보여주는 코드를 추가 할 수 있습니다. – mhawke

2

는 짧은 비밀 방법에 대해 확실하지 않다, 그러나 당신이 세트에서 생성 된 모든 문자열을 저장하는 것이 가정 간단한 정직 기능을 사용하여 구현 될 수있다

import random 

def generate(unique): 
    chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 
    while True: 
     value = "".join(random.choice(chars) for _ in range(5)) 
     if value not in unique: 
      unique.add(value) 
      break 

unique = set() 
for _ in range(10): 
    generate(unique) 
1
size = 5 
''.join(random.choice(string.letters[26:] + string.digits) for in range(size)) 

이것은 짧은 코드를 생성하지만 중복 될 수 있습니다. 저장하기 전에 데이터베이스에서 고유한지 확인하십시오.

def generate(size=5): 
    code = ''.join(random.choice(string.letters[26:] + string.digits) for in range(size)) 
    if check_if_duplicate(code): 
     return generate(size=5) 
    return code 

또는 django 고유 제한을 사용하고 예외를 처리하십시오.