2009-11-26 22 views
5

Estoy desarrollando una aplicación ASP .Net MVC. Una de mis acciones requiere id como parámetro. Por ejemplo:Usando partes de GUID como ID

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

Como se puede ver, estoy usando Guid en lugar de Int. El problema es más cosmético. La url puede ser muy larga, como localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2.

¿Es seguro tomar solo partes del Guid como localhost/Detail/0c157b42?

Respuesta

4

GUID está diseñado de tal manera que está destinado a ser único, pero ninguna parte de él lo es. Ver this blog post para más detalles. Si necesita acortar el GUID, tome un buen resumen, como SHA-1 o (si no tiene problemas de seguridad) MD5.

+0

¿Acortamiento? ¿Quiere decir que toma un GUID de 36 caracteres de largo (si el ejemplo de la pregunta es válido) y lo resume a 32 caracteres?(__if__ usas md5, lo que dará como resultado 32 caracteres, y no SHA1, lo que dará como resultado 48 caracteres) – pihentagy

+0

@pihentagía: El punto es que después de hash puedes tomar parte del hash y será lo suficientemente aleatorio, pero no puede tomar parte del GUID mismo. – sharptooth

3

No, no es seguro.

Sin embargo, puede calcular un hash SHA-2 y tomar los primeros caracteres de eso.

+0

¡Eso no sería único! – pihentagy

+0

Sería más único que una subcadena de un GUID, y posiblemente más exclusivo que un número aleatorio. – Spongeboy

2

No, necesita todo el GUID ya que existe la posibilidad de que un subconjunto no sea exclusivo.

Por ejemplo:

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

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

aviso, sólo en el último número es diferente. Los comienzos son los mismos Tampoco puede usar el final del GUID ya que no hay forma de predecir qué parte del GUID cambiará cuando se cree.

-2

Poco de una respuesta tardía pero en caso de que alguien lee esto ...

dependiendo del uso, se puede proporcionado un valor GUID acortado.

por ejemplo, si el valor de ID se genera y se le da al usuario como una especie de valor de Token de autenticación, durante la generación puede tomar tantos caracteres y compararlos con otros valores de uso. si hay coincidencias, solo genere una nueva y vuelva a comparar hasta que sea única.

Esta técnica también es recomendable si también recorta un valor hash del GUID ... solo para estar seguro. De hecho, cada vez que genere aleatoriamente un valor para ser utilizado como ID, entonces debe asegurarse de que no esté 'en uso'

+0

Aconsejaría no realizar el "control si todavía no está en uso", debido al riesgo de condiciones de carrera. Hacer esto significa que necesita bloquear la base de datos, en caso de que otro hilo genere la misma identificación al mismo tiempo. Es mucho mejor crear un GUID completo o insertar la creación de ID en la responsabilidad del DB (por ejemplo, autoincremento Int) – Spongeboy

0

Algunas otras opciones a considerar- * Si hay más de un Detalles con GUID comenzando por 0c157b42, haga que la URL localhost/Detail/0c157b42 muestre una lista de objetos de detalles aplicables. * Alias ​​de URL: permite un campo "URL amigable" en el objeto Detalles.

0

Puede limpiar el GUID de -s y convertir el HEX en Base32 (A-Z, 0-5) lo que lo acortará a 16 caracteres.

+0

Las guías son enteros de 128 bits. Base32 tiene 32 valores por carácter, que es '2^5 ', 5 bits. Necesitarías '128/5 = 25.6' caracteres para representar completamente un guid. Base64 sería más corto con '128/6 = 21.3'. Los componentes fraccionarios se identifican mediante almohadillas, por lo que necesitarías subir esas cifras un par de muescas para compensar eso. – Travis