내 사이트의 URL 단축기를 만드는 중이고 현재 계획 (제안 할 수 있음)은 단축 된 URL을 생성하기 위해 노드 ID를 사용하는 것입니다. 따라서 이론적으로 노드 26은 short.com/z
노드 1 일 수 short.com/a
있고 노드 52는 short.com/Z
노드 104가 될 수 있습니다 short.com/ZZ
. 사용자가 해당 URL로 이동하면 프로세스를 취소해야합니다 (분명히).
나는 이것에 대해 갈만한 몇 가지 방법을 생각할 수 있지만 더 좋은 방법이 있다고 생각합니다. 어떤 제안?
답변
ASCII에서 int로 :
ord('a')
준다 97
그리고 다시 문자열로 :
- Python2에서 :
str(unichr(97))
- Python3에서 :
chr(97)
준다 'a'
답변
>>> ord("a")
97
>>> chr(97)
'a'
답변
여러 문자가 단일 정수 / 길이 안에 묶인 경우 내 문제는 다음과 같습니다.
s = '0123456789'
nchars = len(s)
# string to int or long. Type depends on nchars
x = sum(ord(s[byte])<<8*(nchars-byte-1) for byte in range(nchars))
# int or long to string
''.join(chr((x>>8*(nchars-byte-1))&0xFF) for byte in range(nchars))
수율 '0123456789'
과x = 227581098929683594426425L
답변
URL을 인코딩하는 BASE58은 어떻습니까? 예를 들어 플리커는 그렇습니다.
# note the missing lowercase L and the zero etc.
BASE58 = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
url = ''
while node_id >= 58:
div, mod = divmod(node_id, 58)
url = BASE58[mod] + url
node_id = int(div)
return 'http://short.com/%s' % BASE58[node_id] + url
다시 숫자로 바꾸는 것도 큰 문제가 아닙니다.
답변
hex(id)[2:]
및을 사용하십시오 int(urlpart, 16)
. 다른 옵션이 있습니다. 귀하의 ID를 base32로 인코딩해도 작동 할 수는 있지만 파이썬에 base32 인코딩을 수행하는 라이브러리가 있다는 것을 모르겠습니다.
분명히 base32 인코더는 base64 모듈 과 함께 Python 2.4에 도입되었습니다 . b32encode
및을 사용해보십시오 b32decode
. 사람들이 단축 URL을 작성하는 경우를 대비 True
하여 casefold
및 map01
옵션을 모두 제공해야 b32decode
합니다.
사실, 나는 그것을 다시 가져갑니다. 나는 여전히 base32 인코딩이 좋은 생각이라고 생각하지만 그 모듈은 URL 단축의 경우에는 유용하지 않습니다. 모듈에서 구현을 살펴보고이 특정 사례에 대해 직접 만들 수 있습니다. 🙂