Pregunta

Estoy tratando de entender crc32 para generar la url única para la página web.

Si usamos el crc32, ¿cuál es el número máximo de urls que se pueden usar para evitar duplicados?

¿Cuál podría ser la longitud aproximada de la cadena para mantener que la suma de control sea 2 ^ 32?

Cuando probé UUID para una url y convertí los bytes de uuid a la base 64, podría reducir a 22 caracteres de largo. Me pregunto si puedo reducir aún más.

Sobre todo quiero convertir la url (máximo de 1024 caracteres) a id en corto.

¿Fue útil?

Solución

No hay un número tal como el " número máximo de urls puede usarse para que podamos evitar duplicados " para CRC32.

El problema es que CRC32 puede producir duplicados, y no es una función de cuántos valores le arrojas, es una función de cómo se ven esos valores.

Por lo tanto, es posible que tenga una colisión en la segunda url, si no tiene suerte.

No debe basar su algoritmo en la producción de un hash único, en lugar de producir un valor único para cada url manualmente.

Otros consejos

Si ya está almacenando la URL completa en una tabla de base de datos, una ID de entero es bastante corta y puede acortarse convirtiéndola a la base 16, 64 u 85. Si puede usar un UUID, puede use un número entero, y puede que también, ya que es más corto y no veo qué beneficio proporcionaría un UUID en su tabla de búsqueda.

La forma correcta de crear una URL corta es almacenar la completa en la base de datos y publicar algo que se asigna al índice de la fila. Una forma compacta es usar la Base64 de la ID de fila, por ejemplo. O podría usar un UID para la clave principal y mostrarlo.

No utilice una suma de comprobación, ya que es demasiado pequeña y es muy probable que entre en conflicto. Un hash criptográfico es más grande y menos probable, pero aún no es el camino correcto.

CRC32 significa verificación de redundancia cíclica con 32 bits, donde cualquier cantidad arbitraria de bits se suma a una suma de verificación de 32 bits. Y las funciones de suma de verificación son supuestas, eso significa que los valores de entrada múltiples tienen el mismo valor de salida. Así que no puedes invertir la función.

No, incluso si usas md5, o cualquier otra suma de comprobación, la URL PUEDE SER duplicada, todo depende de tu suerte.

Así que no hagas una base de URL única en esa suma de verificación

La forma más rápida (¡y quizás la mejor!) de resolver los problemas puede ser simplemente usar un hash de la ruta local y la consulta de un URI determinado, de la siguiente manera:

using System;

namespace HashSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri(
                "http://host.com/folder/file.jpg?code=ABC123");

            string hash = GetPathAndQueryHash(uri);

            Console.WriteLine(hash);
        }

        public static string GetPathAndQueryHash(Uri uri)
        {
            return uri.PathAndQuery.GetHashCode().ToString();
        }
    }
}

Lo anterior supone que el esquema de URI y el host permanecen igual. Si no, GetHashCode funcionará con cualquier cadena.

Para una gran discusión sobre CRC32 Hash Collision visite: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top