Я пишу небольшую статью о человеко-читаемых альтернативах Guids/UID, например, те, которые используются на TinyURL для хэшей URL (которые часто печатаются в журналах, поэтому они должны быть короткими).
Простой uid, который я генерирую, - 6 символов: либо строчная буква (a-z), либо 0-9.
"По моим расчетам капитан", что 6 взаимоисключающих событий, хотя вычисление вероятности столкновения становится немного сложнее, чем P (A или B) = P (A) + P (B), поскольку, очевидно, оно включает номеров и из приведенного ниже кода, вы можете увидеть, что он работает независимо от того, использовать ли число или букву с помощью 50/50.
Меня интересует скорость столкновения, и если приведенный ниже код представляет собой реалистичное моделирование ожидаемой скорости столкновения, которую вы получите от создания хэша. В среднем я получаю 40-50 столкновений на миллион, однако в виду, что uid не будет генерироваться миллион раз одновременно, но, вероятно, только около 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's, однако Sklivvz также является ответом на вторую часть (альтернативу). Можно ли создать уникальный уникальный генератор идентификаторов в базе данных, или это будет клиентская сторона (которая может быть записана в 2 раза)?
Общая идея, с которой я столкнулась, заключалась в использовании идентификаторов в базах данных или других магазинах, которые могут использоваться по телефону или печатным материалам, а не по гигантскому 16-байтовому указателю.
ОБНОВЛЕНИЕ 2: Я поставил формулу для двух взаимоисключающих событий выше, а не из двух независимых (поскольку получение "а" в первый раз не означает, что вы не можете получить ' второй раз). Должны были быть P (A и B) = P (A) x P (B)