2011-01-01 50 views
20

Bây giờ, điều này không nghiêm chỉnh về việc rút ngắn URL, nhưng mục đích của tôi là như vậy, vì vậy hãy xem nó như thế. Tất nhiên các bước để URL rút ngắn là:Thuật toán rút ngắn URL

  1. Hãy URL đầy đủ
  2. Tạo một chuỗi ngắn độc đáo là chìa khóa cho URL
  3. Store URL và chìa khóa trong một cơ sở dữ liệu (một Key- cửa hàng giá trị sẽ là đối sánh hoàn hảo tại đây)

Bây giờ, về điểm thứ hai. Dưới đây là những gì tôi đã đưa ra:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 
UUID uuid = UUID.randomUUID(); 
dos.writeLong(uuid.getMostSignificantBits()); 
String encoded = new String(Base64.encodeBase64(baos.toByteArray()), "ISO-8859-1"); 
String shortUrlKey = StringUtils.left(encoded, 6); // returns the leftmost 6 characters 
// check if exists in database, repeat until it does not 

Điều này có đủ không?

+0

Ngoài sự tò mò, tại sao lại bận tâm với UUID? Tại sao không ví dụ như chỉ tạo ra 5 hoặc nhiều byte từ một thể hiện ngẫu nhiên? –

+1

Tôi bắt đầu wit một ngẫu nhiên/System.nanoTime/địa chỉ mac 'bit sau đó nhận ra rằng uuid có tất cả các :-) – Bozho

+0

@Bozho bạn có thể muốn xem xét [Base32 mã hóa aka Crockford mã hóa] (http: //www.crockford .com/wrmg/base32.html) vì nó có một số ưu điểm như loại bỏ các ký tự có thể mơ hồ như 0 và chữ L. Bạn sẽ kết thúc bằng một URL ngắn hơn nhưng nếu bạn không có hàng tỷ thì có thể đáng giá. –

Trả lời

4

Đối với ứng dụng tải lên tệp tôi đã viết, tôi cũng cần chức năng này.Sau khi đọc this SO article, tôi quyết định gắn bó với một số số ngẫu nhiên và kiểm tra xem chúng có tồn tại trong DB hay không.

Vì vậy, aproach của bạn tương tự như những gì tôi đã làm.

2

Vâng, ý bạn là gì khi rút ngắn URL?

Có các kỹ thuật rất khác nhau. Hầu hết các trang web, AFAIK, sử dụng kỹ thuật này để chỉ đặt biểu mẫu chính (có thể ở dạng mã hóa) vào URL tại một số vị trí nơi nó có thể được phân tích bằng cụm từ thông dụng và chỉ tăng phần còn lại bằng từ khóa.

Ví dụ từ Amazon: http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

Bạn có thể nhập bất cứ điều gì ở vị trí của tên của sản phẩm, chỉ có id ở cuối là quan trọng.

Tuy nhiên, bạn có thể giữ liên kết của mình luôn sạch sẽ và kiểm tra xem nó có chính xác không và chuyển tiếp 301 đến URL thực hoặc đặt URL chuẩn nếu URL sai xuất hiện.

Tuy nhiên:

Nếu bạn muốn làm một cái gì đó giống như TinyURL, câu trả lời của tôi là một không xác định.

Không đủ tốt.

Vâng điều đó còn tùy thuộc.

Nó không "an toàn". Nó sẽ khá dễ đoán URL. Một cách tiếp cận tốt hơn sẽ sử dụng một số chức năng mã hóa như SHA-1/MD5.

Khi nói đến va chạm tôi thực sự không thể nói. GUID được thiết kế để không có va chạm, nhưng bạn chỉ sử dụng 6 ký tự đầu tiên. Tôi không biết chính xác những gì họ đại diện trong thuật toán. Nhưng nó chắc chắn không phải là tối ưu.

Tại sao, bạn không chỉ sử dụng khóa cơ sở dữ liệu tự động tăng thêm khóa chính? Nếu bảo mật là quan trọng, bạn cũng chắc chắn đã đi đến với hơn 6 ký tự.

Trên một dự án tôi đã làm tôi đã sử dụng một cái gì đó giống như

/cơ sở dữ liệu chính-key/băm-of-chính-key-với-một số-token-hoặc-client-thông tin/

Bằng cách này Tôi có thể trực tiếp tìm kiếm khóa chính trong cơ sở dữ liệu đó là cách nhanh nhất có thể nhưng cũng có thể xác minh rằng liên kết không được phát hiện bởi brute buộc bởi băm. Trong trường hợp của tôi, hàm băm là tổng SHA-1 của mã thông báo bí mật của khách hàng và khóa chính.

+0

Tại sao bạn cho rằng sẽ dễ dàng đoán URL? Tôi không nghĩ vậy. Hàm băm tạo ra sản lượng lớn hơn tôi cần, vì vậy một lần nữa tôi phải cắt. Một khóa chính DB băm có thể là tốt, nhưng không cần thiết rằng cơ sở dữ liệu có một tùy chọn cho điều đó. Các cửa hàng có giá trị khóa không – Bozho

+0

Đối với một người viết tắt URL, tại sao có ai đó có thể đoán URL? Cuối cùng, họ nên được chuyển hướng đến trang đó, và truy cập sẽ được công khai (cho một trang web chuẩn bog) hoặc bị hạn chế bởi một số phương tiện khác. – Rob

+0

tùy thuộc vào trường hợp sử dụng @Rob. nếu vậy, tại sao làm băm nào cả và không chỉ sử dụng tăng tự động? tôi chỉ cố gắng làm rõ rằng trường hợp sử dụng và các yêu cầu không rõ ràng trong câu hỏi. –

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