Подтвердить что ты не робот

Создать уникальный идентификатор

Я студент в университете, и наша задача - создать поисковую систему. У меня возникают трудности с созданием уникального идентификатора для назначения каждому URL-адресу при добавлении в границу. Я попытался использовать алгоритм хэширования 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;
}
4b9b3361

Ответ 1

Почему бы просто не использовать 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-адрес, вы можете использовать некоторую форму SHA1 в sourceURL, но я не уверен, что это может сделать.

Ответ 2

Почему бы не использовать GUID?

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

Ответ 3

Если вы хотите использовать sha-256 (guid будет быстрее), вам нужно будет сделать что-то вроде

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

Конечно, это не относится к ascii, и это может быть любой другой алгоритм хеширования, а также

Ответ 4

Почему мы не можем сделать уникальный идентификатор, как показано ниже.

Мы можем использовать DateTime.Now.Ticks и Guid.NewGuid(). ToString() для объединения и создания уникального идентификатора.

По мере добавления DateTime.Now.Ticks мы можем узнать дату и время в секундах, в которых создан уникальный идентификатор.

См. код.

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.

Мы можем даже взять часть тиков в уникальный идентификатор и проверить дату и время позже для будущих ссылок.

Ответ 5

Этот вопрос кажется отвеченным, однако для полноты я бы добавил еще один подход.

Вы можете использовать уникальный генератор идентификационных номеров, который основан на твиттере Snowflake. Реализация С# можно найти здесь.

var id64Generator = new Id64Generator();

// ...

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

Обратите внимание, что одна из очень приятных особенностей этого подхода - возможность иметь несколько генераторов на независимых узлах (возможно, что-то полезное для поисковой системы), генерирующих уникальные идентификаторы глобального времени в реальном времени.

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

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

// ... node 10
var id64Generator = new Id64Generator(10);

Ответ 6

Вот идентификатор идентификатора "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 символов. Вы можете увеличить/уменьшить это, просто измените параметр метода Take.

0.001% дубликатов в 100 миллионов.

Ответ 7

Попробуйте это.

string a = DateTime.Now.Month.ToString() + 
            DateTime.Now.Day.ToString() +
            DateTime.Now.Year.ToString() +
            DateTime.Now.Hour.ToString() +
            DateTime.Now.Minute.ToString() +
            DateTime.Now.Second.ToString() +
            DateTime.Now.Millisecond.ToString();