私は大学の学生であり、私たちの仕事は検索エンジンを作成することです。フロンティアに追加されたときに各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;
}
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を使用できますが、何が達成されるかはわかりません。
GUID を使用しないのはなぜですか?
Guid guid = Guid.NewGuid();
string str = guid.ToString();
ここに、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%の重複。
Sha-256を使用する場合(ガイドの方が高速です)、次のようにする必要があります。
SHA256 shaAlgorithm = new SHA256Managed();
byte[] shaDigest = shaAlgorithm.ComputeHash(ASCIIEncoding.ASCII.GetBytes(url));
return BitConverter.ToString(shaDigest);
もちろん、アスキーする必要はなく、他の種類のハッシュアルゴリズムも使用できます。
以下のように一意の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のティックの一部を取得して、後で参照できるように後で日付と時刻を確認することもできます。
この質問には答えられているようですが、完全を期すために、別のアプローチを追加します。
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);