2009-09-30 19 views

Trả lời

2

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.

1

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).

15

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.

22

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.

1

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 ..

4

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.

0

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-9a-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() 
1

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) 
1

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.

0

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

Các vấn đề liên quan