Frage

Ich versuche crc32 zu verstehen, die eindeutige URL für Web-Seite zu generieren.

Wenn wir die crc32 verwenden, was ist die maximale Anzahl von URLs verwendet werden kann, so dass wir Duplikate vermeiden können?

Was könnte die approximative Stringlänge sein, um die Prüfsumme zu halten sein 2 ^ 32?

Als ich UUID für eine URL versucht, und wandeln die UUID Bytes auf Basis 64, konnte ich bis 22 Zeichen lang reduzieren. Ich frage mich, ich reduzieren kann noch weiter.

Meistens will ich die URL (maximal 1024 Zeichen) zu kurzgeschlossenen ID konvertieren.

War es hilfreich?

Lösung

Es gibt keine solche Zahl als die „maximale Anzahl von URLs verwendet werden, so dass wir Duplikate vermeiden können“ für CRC32.

Das Problem ist, dass CRC32 Duplikate produzieren kann, und es ist nicht davon abhängig, wie viele Werte, die Sie an ihm werfen, es ist eine Funktion von dem, was diese Werte aussehen.

So könnte man eine Kollision auf der zweiten URL haben, wenn Sie Pech haben.

Sie sollten nicht Ihren Algorithmus stützen einen eindeutigen Hash auf der Herstellung, sondern einen eindeutigen Wert für jede URL manuell erzeugen.

Andere Tipps

Wenn Sie bereits die vollständige URL in einer Datenbanktabelle zu speichern, eine ganze Zahl ID ist ziemlich kurz und kürzer durch Umwandlung vorgenommen werden 16 zu stützen, 64 oder 85. Wenn Sie eine UUID verwenden können, können Sie verwenden, um eine ganze Zahl, und auch Sie können, da es kürzer ist, und ich sehe nicht, was ein UUID profitieren in Ihrem Lookup-Tabelle zur Verfügung stellen würde.

Der richtige Weg, um eine kurze URL zu machen, ist die vollen in der Datenbank zu speichern und veröffentlichen etwas, das den Zeilenindex abbildet. Eine kompakte Art und Weise ist die Base64 der Zeilen-ID zu verwenden, zum Beispiel. Oder Sie könnten eine UID für den Primärschlüssel verwenden und zeigen.

Verwenden Sie keine Prüfsumme, weil es zu klein ist und sehr wahrscheinlich zu einem Konflikt. Ein verschlüsselter Hash ist größer und weniger wahrscheinlich, aber es ist noch nicht der richtige Weg zu gehen.

CRC32 Mittel cyclic redundancy check mit 32 Bits, wobei eine beliebige Menge von Bits wird an eine 32-Bit-Kontrollsumme aufsummiert. Und Prüfsummen-Funktionen sind surjektiv, das bedeutet, dass mehrere Eingangswerte den gleichen Ausgangswert haben. Sie können also nicht die Funktion umkehren.

Nein, auch Sie md5 verwenden, oder jede andere Prüfsumme kann die URL sein Duplikat, es hängt alles von Ihrem Glück.

Also nicht eine eindeutige URL Base auf solche Prüfsummen machen

Der schnellste (und vielleicht am besten!) Art und Weise die Dinge zu lösen sein kann, einfach einen Hash-Wert des lokalen Pfad zu verwenden und Abfrage einer bestimmten URI wie folgt:

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();
        }
    }
}

Das oben geht davon aus, dass die URI-Schema und Host die gleichen bleiben. Wenn nicht GetHashCode wird mit jeder Zeichenfolge arbeiten.

Für eine große Diskussion über CRC32 Hashkollision Besuch: http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top