75

私は大学の学生で、私たちの仕事は検索エンジンを作成することです。フロンティアに追加されたときに各 URL に割り当てる一意の ID を生成するのに苦労しています。SHA-256 ハッシュ アルゴリズムと Guid の使用を試みました。GUIDの実装に使用したコードは次のとおりです。

public string generateID(string url_add)
{
    long i = 1;

    foreach (byte b in Guid.NewGuid().ToByteArray())
    {
        i *= ((int)b + 1);
    }

    string number = String.Format("{0:d9}", (DateTime.Now.Ticks / 10) % 1000000000);

    return number;
}
4

7 に答える 7

122

ToString を使用しないのはなぜですか?

public string generateID()
{
    return Guid.NewGuid().ToString("N");
}

URL に基づくものにしたい場合は、次のようにするだけです。

public string generateID(string sourceUrl)
{
    return string.Format("{0}_{1:N}", sourceUrl, Guid.NewGuid());
}

URL を非表示にしたい場合は、sourceURL で何らかの形式の SHA1 を使用できますが、それで何ができるかはわかりません。

于 2012-07-03T14:36:14.317 に答える
34

GUIDを使用しないのはなぜですか?

Guid guid = Guid.NewGuid();
string str = guid.ToString();
于 2012-07-03T14:34:54.967 に答える
6

sha-256 を使用したい場合 (GUID の方が高速です)、次のようにする必要があります。

SHA256 shaAlgorithm = new SHA256Managed();
byte[] shaDigest = shaAlgorithm.ComputeHash(ASCIIEncoding.ASCII.GetBytes(url));
return BitConverter.ToString(shaDigest);

もちろん、ASCII である必要はなく、他の種類のハッシュ アルゴリズムでもかまいません。

于 2012-07-03T14:45:35.263 に答える
4

この質問には答えがあるようですが、完全を期すために、別のアプローチを追加します。

Twitter のSnowflake id ジェネレーターに基づく一意の ID 番号ジェネレーターを使用できます。C# の実装については、こちらを参照してください。

var id64Generator = new Id64Generator();

// ...

public string generateID(string sourceUrl)
{
    return string.Format("{0}_{1}", sourceUrl, id64Generator.GenerateId());
}

このアプローチの非常に優れた機能の 1 つは、独立したノード (おそらく検索エンジンに役立つもの) に複数のジェネレーターを配置して、リアルタイムでグローバルに一意の識別子を生成できることです。

// node 0
var id64Generator = new Id64Generator(0);

// node 1
var id64Generator = new Id64Generator(1);

// ... node 10
var id64Generator = new Id64Generator(10);
于 2015-07-18T09:21:32.223 に答える