2009-09-30 5 views

답변

2

UUID가 긴 이유는 전역에 고유 한 것으로 보장 될 수 있도록 많은 정보가 포함되어 있기 때문입니다.

무언가를 더 짧게하려면 무작위 문자열 생성, 이미 생성 된 문자열의 유니버스에 있는지 확인한 다음 사용되지 않는 문자열을 얻을 때까지 반복해야합니다. 또한 동시성에주의해야합니다 (문자열 집합에 삽입하기 전에 동일한 문자열이 별도의 프로세스에 의해 생성되는 경우 어떻게해야합니까?).

파이썬에서 임의의 문자열을 생성하는 데 도움이 필요하면이 other question이 도움이 될 수 있습니다.

1

이것이 실제로 파이썬이라고는 중요하지 않지만 원하는 길이로 매핑되는 해시 함수 만 있으면됩니다. 예를 들어, MD5를 사용하고 첫 번째 문자는 n입니다. 이 경우 충돌을 조심해야 할 것이다. 그래서 해시 문자열의 공간을 순환하는 소수 (primes) 사용과 같이 충돌 탐지 측면에서 좀 더 견고한 것을 선택하고 싶을 것이다.

15

대부분의 URL 단축자가 임의의 문자열을 사용하는지 잘 모르겠습니다. 제 생각에 그들은 데이터베이스에 URL을 쓰고 새로운 레코드의 정수 ID를 짧은 URL로 인코딩 된 36 또는 62 자 (글자 + 숫자)로 사용합니다.

int를 임의의 기준으로 문자열로 변환하는 파이썬 코드는 here입니다.

22

편집 : 여기 모듈을 작성했습니다. 그걸 써. http://code.activestate.com/recipes/576918/


짧은 고유 URL을 보장합니다 일로부터 계산./1,/2,/3 ... 등.

알파벳에 대문자와 소문자를 추가하면 질문에있는 것과 같은 URL이 제공됩니다. 그리고베이스 10 대신에베이스 62로 계산됩니다.

유일한 문제는 URL이 연속적으로 발생한다는 것입니다.

Map incrementing integer range to six-digit base 26 max, but unpredictably

기본적 접근 방식은 당신이하지 않는 것을 결정 성을 유지하고 보장하면서 단순히 난수의 모양을 제공하기 위해 증분 값 주위 비트를 교환 : 그 문제를 해결하려면, 여기이 질문에 대한 내 대답을 읽어 충돌이있다.

1

당신이 사용할 수 있을지는 모르겠지만, 우리가 밀리의 현재 시간 문자열을 기반으로 고유 한 숫자 ID를 얻을 조프의 콘텐츠 개체를 (예를 들어, 1254298969501)

은 어쩌면 당신은 나머지를 추측 할 수 생성 . 여기에 설명 된 제조법을 사용하여 : How to convert an integer to the shortest url-safe string in Python?, 우리는 실시간으로 실제 ID를 저장하고 디코드하므로 저장 장치가 필요하지 않습니다. 예를 들어, 13 자리의 정수는 기본 62의 7 자의 영숫자 문자로 축소됩니다.

구현을 완료하기 위해 짧은 (xxx.yy) 도메인 이름을 디코딩하고 "찾을 수 없음"URL에 대해 301 리디렉션을 수행합니다.

처음부터 다시 시작한 경우 인코딩 전 숫자 아이디에서 "시작 시간"(밀리 초)을 뺍니다 , 디코딩 할 때 다시 추가하십시오. 또는 객체를 생성 할 때. 도대체 무엇이.

http://pypi.python.org/pypi/shortuuid/0.1

당신이 짧은 뭔가를해야 할 경우, 당신은해야한다 : 즉,이 모듈은 문자열이 전 세계적으로 고유한지 보장, 당신이 원하는 것을 할 것입니다

4

.. 방법이 짧은 것 (그것은 UUID입니다) 원하는 길이로자를 수 있고 충돌을 피할 수있는 무언가를 얻을 수 있어야합니다.

0

내 목표 :는 문자 0-9a-z 구성된 지정된 고정 길이의 고유 식별자를 생성합니다. 예 :

zcgst5od 
9x2zgn0l 
qa44sp0z 
61vv1nl5 
umpprkbt 
ylg4lmcy 
dec0lu1t 
38mhd8i5 
rx00yf0e 
kc2qdc07 

다음은 내 솔루션입니다. 는 (kmkaplan 의해 this answer 각색.)

import random 

class IDGenerator(object): 
    ALPHABET = "abcdefghijklmnopqrstuvwxyz" 

    def __init__(self, length=8): 
     self._alphabet_length = len(self.ALPHABET) 
     self._id_length = length 

    def _encode_int(self, n): 
     # Adapted from: 
     # Source: https://stackoverflow.com/a/561809/1497596 
     # Author: https://stackoverflow.com/users/50902/kmkaplan 

     encoded = '' 
     while n > 0: 
      n, r = divmod(n, self._alphabet_length) 
      encoded = self.ALPHABET[r] + encoded 
     return encoded 

    def generate_id(self): 
     """Generate an ID without leading zeros. 

     For example, for an ID that is eight characters in length, the 
     returned values will range from '10000000' to 'zzzzzzzz'. 
     """ 

     start = self._alphabet_length**(self._id_length - 1) 
     end = self._alphabet_length**self._id_length - 1 
     return self._encode_int(random.randint(start, end)) 

if __name__ == "__main__": 
    # Sample usage: Generate ten IDs each eight characters in length. 
    idgen = IDGenerator(8) 

    for i in range(10): 
     print idgen.generate_id() 
1

Hashids이위한 굉장한 도구이다.

편집 :

다음

파이썬 고유 짧은 URL을 생성하는 Hashids을 사용하는 방법은 다음과 같습니다

from hashids import Hashids 

pk = 123 # Your object's id 
domain = 'imgur.com' # Your domain 

hashids = Hashids(salt='this is my salt', min_length=6) 
link_id = hashids.encode(pk) 
url = 'http://{domain}/{link_id}'.format(domain=domain, link_id=link_id) 
1

파이썬의 short_url가 굉장합니다.

import short_url 

id = 20 # your object id 
domain = 'mytiny.domain' 

shortened_url = "http://{}/{}".format(
            domain, 
            short_url.encode_url(id) 
           ) 

그리고 코드를 디코딩 : 그것은이 도움이 될 것입니다

희망을 :)의

decoded_id = short_url.decode_url(param) 

여기

은 예입니다.

0

저는이 답변이 꽤 늦게 나왔지만 URL 단축 프로젝트를 만들려고 할 때이 질문을 발견했습니다. 이제 완전한 기능을 갖춘 URL 단축키 프로젝트 (소스 코드는 amitt001/pygmy입니다. 파이썬 3에 있습니다)에 대한 답변을 추가하고 있습니다. 따라서 다른 사람에게 도움이 될 수 있습니다.

URL 축소 기의 기본 원칙은 긴 URL에서 int를 가져온 다음이 base.txt 파일을 더 읽기 쉬운 짧은 URL로 변환하는 base62 (base32 등) 인코딩을 사용하는 것입니다.

어떻게 생성 되나요? URL 단축키의 대부분은 데이터 스토어에 URL을 추가하고 autoincrement id를 사용하여 int의 base62 인코딩을 얻는 자동 증가 데이터 저장소를 사용합니다.문자열 프로그램에서

샘플 base62 인코딩 :

# Base-62 hash 

import string 
import time 

_BASE = 62 


class HashDigest: 
    """Base base 62 hash library.""" 

    def __init__(self): 
     self.base = string.ascii_letters + string.digits 
     self.short_str = '' 

    def encode(self, j): 
     """Returns the repeated div mod of the number. 
     :param j: int 
     :return: list 
     """ 
     if j == 0: 
      return [j] 
     r = [] 
     dividend = j 
     while dividend > 0: 
      dividend, remainder = divmod(dividend, _BASE) 
      r.append(remainder) 
     r = list(reversed(r)) 
     return r 

    def shorten(self, i): 
     """ 
     :param i: 
     :return: str 
     """ 
     self.short_str = "" 
     encoded_list = self.encode(i) 
     for val in encoded_list: 
      self.short_str += self.base[val] 
     return self.short_str 

이 단지 부분적인 코드와는 base62 디코딩하는 방법을 표시하지 않습니다. 이 답변의 모든 링크가 내가

을 만든 프로젝트에서 짧게 core/hashdigest.py

에서 전체 base62 인코딩 코드를 확인하세요

관련 문제