CRC32はWebの短いURLを作成します
質問
crc32を理解して、Webページの一意のURLを生成しようとしています。
crc32を使用する場合、重複を避けるために使用できるURLの最大数は何ですか?
チェックサムを2 ^ 32に保つための文字列の近似の長さは何ですか?
URLのUUIDを試し、uuidバイトをbase 64に変換すると、22文字に短縮できました。さらに削減できるのだろうか。
ほとんどの場合、URL(最大1024文字)を短縮IDに変換します。
解決
「最大数のURLを使用して重複を避けることができる」などの数はありません。 CRC32。の場合
問題は、CRC32が重複を生成する可能性があることであり、CRC32はそれをスローする値の数の関数ではなく、それらの値がどのように見えるかの関数です。
不運な場合、2番目のURLで衝突する可能性があります。
アルゴリズムを一意のハッシュの生成に基づいて行うのではなく、各URLに一意の値を手動で生成する必要があります。
他のヒント
既に完全なURLをデータベーステーブルに格納している場合、整数IDはかなり短く、16進、64進、または85進に変換することで短くすることができます。UUIDを使用できる場合、整数を使用します。これは短いため、ルックアップテーブルでUUIDが提供する利点がわからないためです。
短いURLを作成する正しい方法は、完全なURLをデータベースに保存し、行インデックスにマップするものを公開することです。コンパクトな方法は、たとえば、行IDのBase64を使用することです。または、主キーにUIDを使用して表示することもできます。
チェックサムは小さすぎて競合する可能性が高いため、チェックサムを使用しないでください。暗号化ハッシュは大きく、その可能性は低いですが、それでも正しい方法ではありません。
CRC32は、任意のビット数が合計されて32ビットのチェックサムになる32ビットの巡回冗長検査を意味します。また、チェックサム関数は全単射です。つまり、複数の入力値が同じ出力値を持ちます。したがって、関数を逆にすることはできません。
いいえ、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