web-dev-qa-db-ja.com

一意のIDを生成する

私は大学の学生であり、私たちの仕事は検索エンジンを作成することです。フロンティアに追加されたときに各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;
}
54

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を使用できますが、何が達成されるかはわかりません。

82
Jaime Torres

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

Guid guid = Guid.NewGuid();
string str = guid.ToString();
24
abatishchev

ここに、IDジェネレーターのような「YouTube-video-id」があります。 「UcBKmq2XE5a」

StringBuilder builder = new StringBuilder();
Enumerable
   .Range(65, 26)
    .Select(e => ((char)e).ToString())
    .Concat(Enumerable.Range(97, 26).Select(e => ((char)e).ToString()))
    .Concat(Enumerable.Range(0, 10).Select(e => e.ToString()))
    .OrderBy(e => Guid.NewGuid())
    .Take(11)
    .ToList().ForEach(e => builder.Append(e));
string id = builder.ToString();

サイズ11文字のランダムIDを作成します。 Takeメソッドのパラメーターを変更するだけで、それも増減できます。

1億回で0.001%の重複。

11
Ashraf Ali

Sha-256を使用する場合(ガイドの方が高速です)、次のようにする必要があります。

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

もちろん、アスキーする必要はなく、他の種類のハッシュアルゴリズムも使用できます。

3
daz-fuller

以下のように一意のIDを作成できないのはなぜですか。

DateTime.Now.TicksとGuid.NewGuid()。ToString()を使用して、結合して一意のIDを作成できます。

DateTime.Now.Ticksが追加されると、一意のIDが作成される日時を秒単位で見つけることができます。

コードをご覧ください。

var ticks = DateTime.Now.Ticks;
var guid = Guid.NewGuid().ToString();
var uniqueSessionId = ticks.ToString() +'-'+ guid; //guid created by combining ticks and guid

var datetime = new DateTime(ticks);//for checking purpose
var datetimenow = DateTime.Now;    //both these date times are different.

一意のIDのティックの一部を取得して、後で参照できるように後で日付と時刻を確認することもできます。

3

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

Twitterの Snowflake idジェネレーターに基づく一意のID番号ジェネレーターを使用できます。 C#の実装は here にあります。

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);
1
Tom