2010-03-03 46 views
12

Tôi đang tạo dịch vụ rút ngắn liên kết và tôi đang sử dụng mã hóa/giải mã base64 của trường ID được tăng lên để tạo url của tôi. Một url với ID "6" sẽ là: http://mysite.com/Ng==URL shortener: phương pháp mã hóa tốt nhất?

tôi cũng cần phải cho phép người dùng tạo ra một tên url tùy chỉnh, như http://mysite.com/music

Dưới đây là của tôi (có thể bị lỗi) Cách tiếp cận cho đến nay. Giúp đỡ trong việc sửa chữa nó sẽ được đánh giá cao.

Khi ai đó tạo ra một liên kết mới:

  • tôi nhận được ID liên kết lớn nhất từ ​​cơ sở dữ liệu (nó không tự động tăng lên)
  • Tăng ID bởi 1
  • Tạo mã URL ngắn (http://website.com/[short tên url]) bởi base64_encoding rằng ID
  • Chèn vào bảng liên kết: id, short_url_code, destination_url

Khi ai đó tạo ra một liên kết mới và vượt qua một URL tùy chỉnh ngắn:

  • Kế hoạch của tôi đã được base64_decode chuỗi tùy chỉnh của họ và sử dụng như là liên kết ID, nhưng tôi đã không nhận ra rằng bạn có thể không chỉ base64_decode bất kỳ chữ và số và biến nó thành một số.

Có phương pháp mã hóa tốt hơn sẽ cho phép tôi chuyển bất kỳ số nào thành chuỗi ngắn và chuỗi nào thành số, vì vậy tôi luôn có thể tra cứu các url ngắn (cho dù tùy chỉnh hoặc tự tạo) bằng cách chuyển tên thành số và truy vấn liên kết có ID bằng số đó?

+0

Xem thêm http://stackoverflow.com/questions/561486/how-to-convert-an-integer-to-the-shortest-url-safe-string-in-python re. Mã hóa Base64 trong URL – vladr

Trả lời

11

Trước hết, chắc chắn rằng bạn có những hạn chế tính duy nhất ở vị trí trên các cột IDshort_url_code.

Khi ai đó tạo ra một liên kết mới:

  1. Lấy liên kết tiếp theo lớn nhất ID từ cơ sở dữ liệu (vì lý do hiệu suất mà bạn nên thực sự sử dụng REALLY autoincrement hoặc SEQUENCE, tùy thuộc vào những gì RDBMS của bạn cung cấp, nếu không đi trước và chọn MAX(ID)+1)
  2. Tạo mã URL ngắn (http://website.com/[short url name]) từ ID sử dụng base64_encode hoặc bất kỳ tùy chỉnh khác hoặc schem mã hóa tiêu chuẩn e
  3. Chèn vào links bảng: ID, short_url_code, destination_url
  4. Nếu chèn thất bại vì vi phạm chế quay lại bước 1 để thử một mới ID; bạn có thể đã vi phạm vì:

    1. cùng một ID đã được sử dụng (tức là được chèn) song song với một luồng/quy trình khác, v.v.(Điều này sẽ không xảy ra nếu bạn sử dụng autoincrement hoặc SEQUENCE, và có thể xảy ra khá thường xuyên khác), và/hoặc
    2. cùng short_url_code đã được sử dụng như một URL tùy chỉnh (điều này sẽ xảy ra rất seldomly trừ khi ai đó đang cố gắng gây ra rắc rối trên trang web của bạn)
  5. Nếu chèn thành công, cam kết và trả lại URL ngắn cho người dùng

Khi ai đó tạo ra một liên kết mới và vượt qua một URL tùy chỉnh ngắn:

  1. Thực hiện các bước tương tự 1 như trên
  2. Thay vì tạo ra phần URL ngắn từ ID như ở bước 2 ở trên, sử dụng tùy chỉnh short_url_code được cung cấp bởi người dùng
  3. Thực hiện các bước tương tự 3 như trên
  4. Nếu chèn không thành công vì:
    1. vi phạm ràng buộc trên ID: quay lại bước 1 để thử một vi phạm ID
    2. một hạn chế mới về short_url_code: trả về một lỗi cho người dùng yêu cầu ông chọn một URL tùy chỉnh khác nhau, như các URL ngắn, ông/bà cung cấp đã được sử dụng
  5. thực hiện các bước tương tự như trên 5
+0

Cảm ơn Vlad. Tôi nên nói rằng tôi đã xử lý các vi phạm ràng buộc. Tôi đã chuyển sang base32 cho phép tôi chuyển đổi một url tùy chỉnh thành một số và chèn nó như là ID. Điều này làm cho nó dễ dàng bởi vì tôi chỉ phải có ID là khóa chính. Nếu có một sự vi phạm ràng buộc cho đại diện base32 của một tên tùy chỉnh, nó sẽ cho họ biết rằng tên đó đã được sử dụng. Nếu có sự vi phạm ràng buộc đối với một url không tùy chỉnh, nó chỉ tiếp tục tăng ID cho đến khi nó có thể chèn. Điều đó nghe có vẻ giống như một giải pháp tốt? – makeee

+0

phụ thuộc vào sự cân bằng mà bạn sẵn sàng thực hiện; hầu hết các kiểu 'int' cơ bản của cơ sở dữ liệu dài tối đa 64 bit (loại' bigint' hoặc tương đương), có nghĩa là nếu tôi cung cấp cho bạn URL ngắn tùy chỉnh dài hơn 64/5 = 12 (5 = log2 (32)) các ký tự bạn sẽ không thể chứa được tôi. Có thể chấp nhận không cho phép người dùng cung cấp URL tùy chỉnh dài hơn 12 ký tự không? – vladr

+0

Điểm tốt. Tôi cần nhiều hơn 12 ký tự. Làm thế nào về điều này: Khi tạo liên kết, nếu tên tùy chỉnh nhiều hơn 12 ký tự thì tôi chỉ sử dụng một ID lớn nhất tiếp theo (không bao gồm ID của liên kết tên tùy chỉnh). Nếu nó nhỏ hơn 12 ký tự, tôi mã hóa tên tùy chỉnh trong ID. Sau đó, khi tìm kiếm một liên kết bằng tên ngắn của nó, nếu ID đó không được tìm thấy trong DB có nghĩa là nó đã được hơn 12 ký tự, vì vậy sau đó tôi chỉ cần tìm nó lên bởi tên ngắn của nó. – makeee

2

base64 có thể được sử dụng để làm các url ngắn, nhưng nó cũng có thể làm cho url lâu hơn. Ví dụ: base64_encode của số 1 là 'MQ ==' gấp 4 lần kích thước. Base64 sẽ luôn có 2 ký tự để có được 64 bit, đó không phải là lý tưởng cho các url ngắn.

Nếu kích thước là yếu tố quan trọng nhất thì bạn có thể tạo ra các url ngắn nhất bằng cách dựa vào internationalization.

Điều này có thể tạo URI khá dài (tối đa 9 ký tự ASCII cho một ký tự Unicode), nhưng ý định là trình duyệt chỉ cần hiển thị biểu mẫu đã giải mã và nhiều giao thức có thể gửi UTF-8 mà không cần % HH thoát.

Hãy nhớ rằng Trình duyệt hoạt động khá tốt với UTF-8 và twitter sẽ không gặp sự cố với các url này.

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