Webページの一意のURLを生成するためにcrc32を理解しようとしています。
crc32 を使用する場合、重複を避けるために使用できる URL の最大数はいくつですか?
チェックサムを 2^32 に維持するためのおおよその文字列の長さは?
URL の UUID を試し、uuid バイトを base 64 に変換すると、22 文字の長さに減らすことができました。もっと減らせるかな。
ほとんどの場合、URL (最大 1024 文字) を短縮 ID に変換したいと考えています。
短い URL を作成する正しい方法は、完全な URL をデータベースに保存し、行インデックスにマップするものを公開することです。コンパクトな方法は、たとえば、行 ID の Base64 を使用することです。または、主キーに UID を使用してそれを表示することもできます。
チェックサムは小さすぎて競合する可能性が非常に高いため、使用しないでください。暗号化ハッシュはより大きく、可能性は低くなりますが、それでも正しい方法ではありません。
いいえ、md5 やその他のチェックサムを使用していても、URL が重複している可能性があります。運次第です。
したがって、これらのチェックサムに基づいて一意の URL を作成しないでください
物事を解決する最も迅速な (そしておそらく最良の!) 方法は、次のように、ローカル パスのハッシュと特定の URI のクエリを使用することです。
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();
}
}
}
上記は、URI スキームとホストが同じままであることを前提としています。そうでない場合、GetHashCode は任意の文字列で機能します。
CRC32 ハッシュ衝突に関する詳細な議論については、http: //episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/821008399831をご覧ください。