Я пишу небольшую статью о удобочитаемых альтернативах Guids / UID, например, используемым в TinyURL для хэшей url (которые часто печатаются в журналах, поэтому должны быть короткими).
Простой генерируемый вами uid - 6 символов: строчная буква (a-z) или 0-9.
«По словам моего капитана по расчетам», это 6 взаимоисключающих событий, хотя вычисление вероятности столкновения становится немного сложнее, чем P (A или B) = P (A) + P (B), поскольку, очевидно, оно включает цифры и из кода ниже, вы можете увидеть, как использовать цифру или букву, используя 50/50.
Меня интересует частота столкновений, и если приведенный ниже код является реалистичной имитацией ожидаемой частоты столкновений, которую вы получите от генерации хеша. В среднем я получаю 40-50 столкновений на миллион, однако, учитывая, что идентификатор не будет генерироваться миллион раз за раз, но, вероятно, только около 10-1000 раз в минуту.
Какова вероятность столкновения каждый раз, и кто-нибудь может предложить лучший способ сделать это?
static Random _random = new Random();
public static void main()
{
// Size of the key, 6
HashSet<string> set = new HashSet<string>();
int clashes = 0;
for (int n=0;n < 1000000;n++)
{
StringBuilder builder = new StringBuilder();
for (int i =0;i < 7;i++)
{
if (_random.NextDouble() > 0.5)
{
builder.Append((char)_random.Next(97,123));
}
else
{
builder.Append(_random.Next(0,9).ToString());
}
}
if (set.Contains(builder.ToString()))
{
clashes++;
Console.WriteLine("clash: (" +n+ ")" +builder.ToString());
}
set.Add(builder.ToString());
_random.Next();
//Console.Write(builder.ToString());
}
Console.WriteLine("Clashes: " +clashes);
Console.ReadLine();
}
UPDATE:
Вот итоговая статья из этого вопроса
Я действительно задал здесь два вопроса, поэтому я обманывал. Ответ, который я получил, был rcar, однако Sklivvz также является ответом на 2-ю часть (альтернатива). Можно ли создать в базе данных собственный генератор уникальных идентификаторов, или это будет на стороне клиента (в первую очередь будет 2 чтения)?
Основная идея, которую я преследовал, заключалась в использовании идентификаторов в базах данных или других магазинах, которые можно использовать по телефону или в печатном виде, а не в виде гигантского 16-байтового гида.
ОБНОВЛЕНИЕ 2: Я поместил формулу для двух взаимоисключающих событий выше вместо 2 независимых (поскольку получение «а» в первый раз не означает, что вы не можете получить «а» второй раз). Должно было быть P (A и B) = P (A) x P (B)