Создать уникальный идентификатор
Я студент в университете, и наша задача - создать поисковую систему. У меня возникают трудности с созданием уникального идентификатора для назначения каждому 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;
}
Ответы
Ответ 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();