Làm cách nào để tạo URL duy nhất trong Python a la http://imgur.com/gM19g hoặc http://tumblr.com/xzh3bi25y Khi sử dụng uuid từ python, tôi nhận được một URL rất lớn. Tôi muốn một cái gì đó ngắn hơn cho URL.Làm cách nào để tạo URL ngắn độc đáo bằng Python?
Trả lời
Lý do UUID dài vì chúng chứa nhiều thông tin để chúng có thể được đảm bảo duy nhất trên toàn cầu.
Nếu bạn muốn một cái gì đó ngắn hơn, bạn sẽ cần phải làm một cái gì đó như tạo một chuỗi ngẫu nhiên, kiểm tra xem nó có trong vũ trụ của chuỗi đã tạo hay không và lặp lại cho đến khi bạn nhận được chuỗi chưa sử dụng. Bạn cũng sẽ cần phải xem ra cho đồng thời ở đây (những gì nếu cùng một chuỗi được tạo ra bởi một quá trình riêng biệt trước khi bạn chèn vào tập hợp các chuỗi?).
Nếu bạn cần trợ giúp tạo chuỗi ngẫu nhiên bằng Python, other question này có thể hữu ích.
Nó không thực sự quan trọng rằng đây là Python, nhưng bạn chỉ cần một hàm băm ánh xạ tới độ dài bạn muốn. Ví dụ: có thể sử dụng MD5 và sau đó chỉ cần n
ký tự đầu tiên. Mặc dù vậy, bạn sẽ phải xem xét các va chạm trong trường hợp đó, vì vậy bạn có thể muốn chọn thứ gì đó mạnh mẽ hơn một chút về phát hiện xung đột (như sử dụng các số nguyên tố để xoay vòng không gian của các chuỗi băm).
Tôi không chắc chắn hầu hết các công cụ rút ngắn URL sử dụng chuỗi ngẫu nhiên. Ấn tượng của tôi là họ viết URL vào cơ sở dữ liệu, sau đó sử dụng ID nguyên của bản ghi mới làm URL ngắn, được mã hóa cơ sở 36 hoặc 62 (chữ cái + chữ số).
Mã Python để chuyển đổi int thành chuỗi trong các cơ sở tùy ý là here.
Chỉnh sửa: Ở đây, tôi đã viết một mô-đun cho bạn. Sử dụng nó. http://code.activestate.com/recipes/576918/
Đếm từ 1 sẽ đảm bảo URL ngắn, duy nhất./1,/2,/3 ... v.v.
Thêm chữ hoa và chữ thường vào bảng chữ cái của bạn sẽ cung cấp URL giống như các URL trong câu hỏi của bạn. Và bạn chỉ cần đếm ở base-62 thay vì base-10.
Bây giờ, vấn đề duy nhất là URL liên tiếp. Để khắc phục điều đó, đọc câu trả lời của tôi cho câu hỏi này ở đây:
Map incrementing integer range to six-digit base 26 max, but unpredictably
Về cơ bản phương pháp này là chỉ cần trao đổi bit xung quanh trong giá trị incrementing để cung cấp cho sự xuất hiện của tính ngẫu nhiên khi vẫn duy trì định mệnh và đảm bảo rằng bạn không có bất kỳ va chạm nào.
Tôi không biết nếu bạn có thể sử dụng điều này, nhưng chúng ta tạo ra đối tượng nội dung trong Zope rằng có được id số độc đáo dựa trên chuỗi thời gian hiện tại, trong millis (ví dụ: 1254298969501)
lẽ bạn có thể đoán phần còn lại . Sử dụng công thức được mô tả ở đây: How to convert an integer to the shortest url-safe string in Python?, chúng tôi mã hóa và giải mã id thực khi đang di chuyển mà không cần lưu trữ. Ví dụ, số nguyên 13 chữ số được giảm xuống còn 7 ký tự chữ và số.
Để hoàn tất quá trình triển khai, chúng tôi đã đăng ký ngắn (xxx.yy) tên miền, giải mã và chuyển hướng 301 cho URL "không tìm thấy",
Nếu tôi bắt đầu lại, tôi sẽ trừ thời gian "bắt đầu" (tính bằng milis) khỏi id số trước khi mã hóa , sau đó thêm lại khi giải mã. Hoặc người nào khác khi tạo ra các đối tượng. Bất cứ điều gì. Đó sẽ là cách ngắn hơn ..
Module này sẽ làm những gì bạn muốn, đảm bảo rằng chuỗi là duy nhất trên toàn cầu (nó là một UUID):
http://pypi.python.org/pypi/shortuuid/0.1
Nếu bạn cần một cái gì đó ngắn hơn, bạn nên có thể cắt ngắn nó đến độ dài mong muốn và vẫn nhận được một cái gì đó mà hợp lý có lẽ sẽ tránh được xung đột.
Hãy thử điều này http://code.google.com/p/tiny4py/ ... Nó vẫn đang được phát triển nhưng rất hữu ích !!
Mục tiêu của tôi: Tạo số nhận dạng duy nhất của độ dài cố định được chỉ định bao gồm các ký tự 0-9
và a-z
. Ví dụ:
zcgst5od
9x2zgn0l
qa44sp0z
61vv1nl5
umpprkbt
ylg4lmcy
dec0lu1t
38mhd8i5
rx00yf0e
kc2qdc07
Đây là giải pháp của tôi. (Phỏng theo this answer bởi kmkaplan.)
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 là một công cụ tuyệt vời cho việc này.
Edit:
Dưới đây là làm thế nào để sử dụng Hashids để tạo ra một URL ngắn độc đáo với Python:
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)
Python của short_url là tuyệt vời.
Dưới đây là một ví dụ:
import short_url
id = 20 # your object id
domain = 'mytiny.domain'
shortened_url = "http://{}/{}".format(
domain,
short_url.encode_url(id)
)
Và để giải mã mã:
decoded_id = short_url.decode_url(param)
Đó là nó :)
Hy vọng điều này sẽ giúp.
Tôi biết câu trả lời này đến khá muộn nhưng tôi tình cờ gặp phải câu hỏi này khi tôi dự định tạo dự án rút ngắn URL. Bây giờ tôi đã triển khai một dự án rút ngắn URL đầy đủ chức năng (mã nguồn tại số amitt001/pygmy trong Python 3) Tôi đang thêm một câu trả lời là nó được thực hiện như thế nào. Vì vậy, nó có thể giúp đỡ người khác:
Nguyên tắc cơ bản đằng sau bất kỳ trình rút ngắn URL nào là lấy int từ URL dài, sau đó sử dụng mã hóa base62 (base32, v.v.) để chuyển int này thành URL ngắn dễ đọc hơn.
Int này được tạo như thế nào? Hầu hết các trình rút gọn URL sử dụng một số kho dữ liệu tự động tăng thêm để thêm URL vào kho dữ liệu và sử dụng id autoincrement để lấy mã hóa base62 của int.mã hóa base62
Các mẫu từ chương trình chuỗi:
# 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
Đây chỉ là một mã một phần và nó không hiển thị như thế nào base62 được giải mã. Kiểm tra mã mã hóa base62 hoàn chỉnh tại core/hashdigest.py
Tất cả các liên kết trong câu trả lời này được rút ngắn từ dự án tôi đã tạo
- 1. Có cách nào để tạo mã ngắn độc đáo như GUID ngắn không?
- 2. Tôi làm cách nào để rút ngắn URL bằng python?
- 3. Tạo các biến độc đáo
- 4. Tạo NSMutableArray hoặc NSMutableSet độc đáo
- 5. Làm thế nào để Koala chơi độc đáo với Omniauth?
- 6. MongoDB Morphia - Độc đáo
- 7. Làm cách nào để goo.gl rút ngắn url trong js?
- 8. ID HttpSession độc đáo như thế nào?
- 9. Kết hợp hai danh sách theo cách độc đáo bằng Python
- 10. Tạo hình ảnh độc đáo (GUID to Image)
- 11. LINQ độc đáo như thế nào?
- 12. hashcode độc đáo
- 13. Lấy Tuples độc đáo từ Danh sách, Python
- 14. XAML độc đáo như thế nào?
- 15. Python - Danh sách các từ điển độc đáo
- 16. Tôi làm cách nào để mã hóa url bằng Python?
- 17. Ràng buộc Python Subversion có gói độc đáo với `pip`?
- 18. Library để tạo URL bằng Python
- 19. MPMediaItemPropertyPersistentID độc đáo như thế nào?
- 20. Python: Tính độc đáo cho danh sách liệt kê
- 21. Tạo mảng kết hợp độc đáo từ mảng chuỗi
- 22. MySQL độc đáo cột chuỗi
- 23. ID độc đáo trên NSViews
- 24. Tạo Mã định danh Android Toàn cầu Độc đáo
- 25. MySQL Tạo sự kết hợp các cột độc đáo
- 26. Làm cách nào để gọi thủ tục được lưu trữ với các tham số độc đáo?
- 27. Tôi làm cách nào để rút ngắn URL bằng lược đồ tùy chỉnh?
- 28. Làm thế nào để xử lý KeyboardInterrupt (Ctrl-c) độc đáo với pycurl?
- 29. Thuật toán rút ngắn URL
- 30. Cách lấy URL dài từ URL ngắn?