質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top