2009-11-26 21 views
5

Tôi đang phát triển một ứng dụng ASP .Net MVC. Một trong những hành động của tôi yêu cầu id làm thông số. Ví dụ:Sử dụng các bộ phận của GUID làm ID

public actionresult Detail(Guid id){ 
    return View(); 
} 

Như bạn thấy, tôi đang sử dụng Guid thay vì Int. Vấn đề là mỹ phẩm hơn. Url có thể rất dài, chẳng hạn như localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2.

Có an toàn khi chỉ lấy một phần của Guid như localhost/Detail/0c157b42?

Trả lời

4

GUID được thiết kế theo cách mà nó được dự định là duy nhất, nhưng bất kỳ phần nào của nó thì không. Xem this blog post để biết chi tiết. Nếu bạn cần rút ngắn GUID, hãy sử dụng hàm băm tốt của nó - như SHA-1 hoặc (nếu bạn không có vấn đề bảo mật) MD5.

+0

Rút ngắn? Bạn có nghĩa là, bạn có một GUID dài 36 char (nếu ví dụ trong câu hỏi là hợp lệ), và __shorten__ nó đến 32 ký tự?(__if__ bạn sử dụng md5, sẽ dẫn đến 32 ký tự, chứ không phải SHA1, sẽ tạo ra 48 ký tự) – pihentagy

+0

@pihentagy: Điểm sau khi băm bạn có thể lấy một phần băm và nó sẽ đủ ngẫu nhiên, nhưng bạn không thể lấy một phần của GUID. – sharptooth

3

Không, không an toàn.

Bạn có thể tính toán hàm băm SHA-2 của nó và lấy một vài ký tự đầu tiên.

+0

Điều đó sẽ không phải là duy nhất! – pihentagy

+0

Nó sẽ độc đáo hơn một chuỗi con của GUID và có thể độc đáo hơn một số ngẫu nhiên. – Spongeboy

2

Không, bạn cần toàn bộ GUID vì có khả năng tập hợp con không phải là duy nhất.

Ví dụ:

0c157b42-379d-41d5-b9ba-83e9df9985b2

0c157b42-379d-41d5-b9ba-83e9df9985b3

Thông báo, chỉ số cuối cùng là khác nhau. Các khởi đầu đều giống nhau. Bạn không thể sử dụng đầu cuối của GUID vì không có cách nào để dự đoán phần nào của GUID sẽ thay đổi khi tạo ra nó.

-2

Bit trả lời trễ nhưng trong trường hợp ai đó đọc ...

tùy thuộc vào việc sử dụng, bạn có thể cung cấp giá trị GUID rút ngắn. Ví dụ:

ví dụ: nếu giá trị ID được tạo và được cung cấp cho người dùng dưới dạng giá trị Mã thông báo xác thực thì trong suốt quá trình tạo, bạn có thể lấy nhiều ký tự và so sánh nó với các giá trị sử dụng khác. nếu có bất kỳ trận đấu nào, thì chỉ cần tạo một trận đấu mới và so sánh lại cho đến khi trận đấu duy nhất.

Kỹ thuật này cũng được khuyến khích nếu bạn cắt một giá trị băm của GUID quá .. chỉ để được an toàn. Trên thực tế, bất kỳ khi nào bạn tạo ngẫu nhiên một giá trị được sử dụng làm ID thì bạn nên đảm bảo rằng giá trị đó không được sử dụng là 'đã sử dụng'

+0

Tôi khuyên bạn không nên thực hiện "kiểm tra nếu chưa được sử dụng", do rủi ro của điều kiện chủng tộc. Làm điều này có nghĩa là bạn cần khóa cơ sở dữ liệu, trong trường hợp một luồng khác tạo cùng một id cùng một lúc. Tốt hơn hết là tạo một GUID đầy đủ, hoặc đẩy việc tạo ID trên trách nhiệm của DB (ví dụ: Int tự động tăng) – Spongeboy

0

Một số tùy chọn khác để xem xét- * Nếu có nhiều chi tiết với GUID bắt đầu bằng 0c157b42, có URL localhost/Detail/0c157b42 hiển thị danh sách các đối tượng Chi tiết có thể áp dụng. * Bí danh URL - cho phép trường "URL thân thiện" trên đối tượng Chi tiết.

0

Bạn có thể xóa GUID của -s và chuyển đổi HEX thành Base32 (A-Z, 0-5) sẽ rút ngắn thành 16 ký tự.

+0

Các chỉ dẫn là các số nguyên 128 bit. Base32 là 32 giá trị cho mỗi ký tự, là '2^5', 5 bit. Bạn cần '128/5 = 25,6' ký tự để thể hiện đầy đủ một guid. Base64 sẽ ngắn hơn với '128/6 = 21.3'. Các thành phần phân đoạn được xác định bởi các paddings, vì vậy bạn cần phải bump những con số này lên một vài bậc để đền bù cho điều đó. – Travis

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