2009-11-26 24 views
5

Bir ASP. NET MVC uygulaması geliştiriyorum. Benim eylemlerimden biri parametre olarak id gerektirir. Örneğin: Gördüğünüz gibiGUID'nin Parçalarını Kimlik Olarak Kullanma

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

, ben Guid yerine Int kullanıyorum. Sorun daha kozmetik. URL, localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2 gibi çok uzun olabilir.

localhost/Detail/0c157b42 gibi Guid gibi bölümlerin sadece güvenli bir parçası mı?

cevap

4

GUID, benzersiz olması amaçlanan bir şekilde tasarlanmıştır, ancak bunun herhangi bir kısmı değildir. Detaylar için bkz. this blog post. GUID'yi kısaltmanız gerekiyorsa, SHA-1 veya (güvenlik sorunlarınız yoksa) MD5 gibi iyi bir özet alın. kullanımına bağlı olarak

+0

Kısalma? Yani sen almak bir 36 karakter uzunluğunda GUID (Söz konusu örnek geçerli olup olmadığını) ve 32 karaktere __shorten__?(__if__, 32 karaktere neden olacak, md5 kullanıyorsunuz, ve 48 karaktere neden olacak olan SHA1 değil) – pihentagy

+0

@pihentagy: Bu nokta, karma işlemden sonra karma parçanın bir parçasını alabiliyor ve yeterince rasgele olacak. GUID'in bir parçası olamaz. – sharptooth

3

Hayır, güvenli değil.

Bununla birlikte, bir SHA-2 karmasını hesaplayabilir ve bunun ilk birkaç karakterini alabilirsiniz.

+0

Bu benzersiz olmaz! – pihentagy

+0

bir GUID'nin bir alt dize daha fazla benzersiz ve bir rastgele sayı muhtemelen daha benzersiz olacaktır. – Spongeboy

2

Hayır, bir alt kümenin benzersiz olma olasılığı olduğundan, tüm GUID'ye ihtiyacınız vardır. Örneğin

:

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

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

Bildirim sadece son numarası farklıdır. Başlangıçlar her ikisi de aynı. GUID'in hangi parçasını oluşturulduğunda değiştireceğini tahmin etmenin bir yolu olmadığından GUID'nin sonunu kullanamazsınız.

-2

geç bir yanıt Bit ancak durumunda herkes bu okur ...

, kısaltılmış bir GUID değerini temin edebilirsiniz.

kimlik değeri oluşturulur ve değerinin bir Kimlik Doğrulama Kodu tür olarak kullanıcıya verilmesi halinde, örneğin, o nesil boyunca sadece bununla sayıda karakter alabilir ve kullanım değerlerinde diğer ile karşılaştırın. Eğer herhangi bir eşleşme varsa, sadece yeni bir tane oluşturun ve benzersiz olana kadar yeniden karşılaştırın. Eğer çok GUID ile ilgili bir karma değer Döşeme eğer

Bu teknik

Emin olmak için .. Ayrıca tavsiye edilir. Aslında, rasgele bir şekilde ID olarak kullanılacak bir değer oluşturduğunuzda, "kullanılmakta olan" olmadığından emin olmalısınız.

+0

Yarış koşullarının riskinden dolayı, "kullanımda olup olmadığını kontrol et" kendiniz yapmamanızı tavsiye ederim. Bunu yapmak, başka bir iş parçacığının aynı kimliği aynı anda oluşturması durumunda veritabanını kilitlemeniz gerektiği anlamına gelir. Tam bir GUID oluşturmak veya DB'nin sorumluluğuna (örneğin, otomatik artışlı Int) – Spongeboy

0

Gözden geçirilmesi gereken diğer seçenekler * Birden fazla Ayrıntıya sahip GUID'ler varsa 0c157b42, URL'sine sahip localhost/Ayrıntı/0c157b42 ilgili Ayrıntılar nesnesinin bir listesini gösterir. * URL takma - Ayrıntılar nesnesinde "Uygun URL" alanına izin ver.

0

Sen -s GUID temizlemek ve 16 karaktere kısaltır Base32 (A-Z, 0-5) için HEX dönüştürebilirsiniz.

+0

Kılavuzlar üzerinde kimlik oluşturmaya itmek çok daha iyidir. Kılavuzlar 128 bit tam sayıdır. Base32, karakter başına 32 değer olup, '2^5', 5 bittir. Bir rehberi tam olarak temsil etmek için 128/5 = 25,6 karakterine ihtiyacınız vardır. Base64, 128/6 = 21.3' ile daha kısa olacaktır. Fraksiyonel bileşenler dolgularla tanımlanır, bu yüzden bunu telafi etmek için bu rakamları birkaç çentiğe çarptırmanız gerekir. – Travis

İlgili konular