파이썬에서 고유 한 URL을 만들 수있는 방법 http://imgur.com/gM19g 또는 http://tumblr.com/xzh3bi25y 파이썬에서 uuid를 사용할 때 매우 커집니다. 나는 URL을 위해 더 짧은 것을 원한다.Python으로 고유 한 짧은 URL을 만드는 방법은 무엇입니까?
답변
UUID가 긴 이유는 전역에 고유 한 것으로 보장 될 수 있도록 많은 정보가 포함되어 있기 때문입니다.
무언가를 더 짧게하려면 무작위 문자열 생성, 이미 생성 된 문자열의 유니버스에 있는지 확인한 다음 사용되지 않는 문자열을 얻을 때까지 반복해야합니다. 또한 동시성에주의해야합니다 (문자열 집합에 삽입하기 전에 동일한 문자열이 별도의 프로세스에 의해 생성되는 경우 어떻게해야합니까?).
파이썬에서 임의의 문자열을 생성하는 데 도움이 필요하면이 other question이 도움이 될 수 있습니다.
이것이 실제로 파이썬이라고는 중요하지 않지만 원하는 길이로 매핑되는 해시 함수 만 있으면됩니다. 예를 들어, MD5를 사용하고 첫 번째 문자는 n
입니다. 이 경우 충돌을 조심해야 할 것이다. 그래서 해시 문자열의 공간을 순환하는 소수 (primes) 사용과 같이 충돌 탐지 측면에서 좀 더 견고한 것을 선택하고 싶을 것이다.
대부분의 URL 단축자가 임의의 문자열을 사용하는지 잘 모르겠습니다. 제 생각에 그들은 데이터베이스에 URL을 쓰고 새로운 레코드의 정수 ID를 짧은 URL로 인코딩 된 36 또는 62 자 (글자 + 숫자)로 사용합니다.
int를 임의의 기준으로 문자열로 변환하는 파이썬 코드는 here입니다.
편집 : 여기 모듈을 작성했습니다. 그걸 써. 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
기본적 접근 방식은 당신이하지 않는 것을 결정 성을 유지하고 보장하면서 단순히 난수의 모양을 제공하기 위해 증분 값 주위 비트를 교환 : 그 문제를 해결하려면, 여기이 질문에 대한 내 대답을 읽어 충돌이있다.
당신이 사용할 수 있을지는 모르겠지만, 우리가 밀리의 현재 시간 문자열을 기반으로 고유 한 숫자 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
당신이 짧은 뭔가를해야 할 경우, 당신은해야한다 : 즉,이 모듈은 문자열이 전 세계적으로 고유한지 보장, 당신이 원하는 것을 할 것입니다
.. 방법이 짧은 것 (그것은 UUID입니다) 원하는 길이로자를 수 있고 충돌을 피할 수있는 무언가를 얻을 수 있어야합니다.
시험해보십시오. http://code.google.com/p/tiny4py/ ... 아직 개발 중이지만 매우 유용합니다 !!
내 목표 :는 문자 0-9
및 a-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()
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)
파이썬의 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)
여기
은 예입니다.저는이 답변이 꽤 늦게 나왔지만 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 인코딩 코드를 확인하세요
- 1. mysql에서 고유 한 의존성을 만드는 방법은 무엇입니까?
- 2. 짧은 고유 ID
- 3. Ruby에서 고유 한 트리를 만드는 가장 빠른 방법은 무엇입니까?
- 4. 서블릿에 URL을 만드는 방법은 무엇입니까?
- 5. 랜덤 URL을 만드는 방법은 무엇입니까?
- 6. 정수에서 유일한 짧은 문자열을 얻는 방법은 무엇입니까?
- 7. .NET에서 고유 한 스레드마다 고유 한 난수를 생성하는 방법은 무엇입니까?
- 8. JCombobox에서 선의 고유 한 글꼴 색을 만드는 방법은 무엇입니까?
- 9. dict.fromkeys를 사용하여 각 키에 고유 한 값을 만드는 방법은 무엇입니까?
- 10. MySQL 프로 시저에서 고유 한 임시 테이블을 만드는 방법은 무엇입니까?
- 11. 운영 체제가 고유 한 파일 핸들을 만드는 방법은 무엇입니까?
- 12. 문자열의 벡터에서 고유 한 이름 집합을 만드는 방법은 무엇입니까?
- 13. JavaScript에서 jQuery와 같은 고유 한 함수를 만드는 방법은 무엇입니까?
- 14. 중첩 된 사전에서 Python으로 고유 값을 추출하는 방법은 무엇입니까?
- 15. HTML의 고유 한 이미지 URL을 자르십시오.
- 16. NULL 열에 고유 인덱스를 만드는 방법은 무엇입니까?
- 17. 레일에 "짧은"중첩 된 가상 URL을 구현하는 방법은 무엇입니까?
- 18. MySQL에서 짧은 고유 ID를 만드는 가장 좋은 방법
- 19. 내 iPhone 앱에서 짧은 URL을 가져 오는 방법은 무엇입니까?
- 20. 짧은 URL 시스템 : 맞춤 URL을 리디렉션하는 방법은 무엇입니까?
- 21. 짧은 URL에서 긴 URL을 가져 오는 방법은 무엇입니까?
- 22. 고유 한 문자열 시작을 찾는 방법은 무엇입니까?
- 23. mysql에서 고유 한 열을 계산하는 방법은 무엇입니까?
- 24. Access에서 고유 한 문자열을 찾는 방법은 무엇입니까?
- 25. 목록에 고유 한 요소가 포함되도록하는 방법은 무엇입니까?
- 26. 이미지에 고유 한 이름을 할당하는 방법은 무엇입니까?
- 27. 사용자 가입을 추적하기위한 고유 URL을 생성하는 방법은 무엇입니까?
- 28. URL을 우호적으로 만드는 가장 좋은 방법은 무엇입니까?
- 29. 친숙한 URL을 수동으로 만드는 방법은 무엇입니까? (PHP)
- 30. 스프링 포틀릿 URL을 친숙하게 만드는 방법은 무엇입니까?