Необходимо обрабатывать> 1000, но <10000 новых записей в день
Невозможно использовать GUID / UUID, номера автоинкремента и т. Д.
В идеале должно состоять из 5 или 6 символов, конечно, может быть альфа
Хотел бы повторно использовать существующие, хорошо известные алгоритмы, если они доступны
Что-нибудь там?
Ответы:
База 62 используется командами tinyurl и bit.ly для сокращенных URL. Это хорошо известный метод создания «уникальных», удобочитаемых идентификаторов. Конечно, вам нужно будет хранить созданные идентификаторы и проверять наличие дубликатов при создании, чтобы гарантировать уникальность. (См. Код внизу ответа)
Базовые 62 показателя уникальности
5 символов в базе 62 дадут вам 62 ^ 5 уникальных идентификаторов = 916,132,832 (~ 1 миллиард). При 10 тыс. Идентификаторов в день вы будете в порядке в течение более 91 тыс. Дней.
6 символов в базе 62 дадут вам 62 ^ 6 уникальных идентификаторов = 56 800 235 584 (56+ миллиардов). При 10 тысячах идентификаторов в день вы будете в порядке в течение 5+ миллионов дней.
Базовые 36 показателей уникальности
6 символов дадут вам 36 ^ 6 уникальных идентификаторов = 2,176,782,336 (2+ миллиарда)
7 символов дадут вам 36 ^ 7 уникальных идентификаторов = 78,364,164,096 (78+ миллиардов)
Код:
public void TestRandomIdGenerator() { // create five IDs of six, base 62 characters for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase62(6)); // create five IDs of eight base 36 characters for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase36(8)); } public static class RandomIdGenerator { private static char[] _base62chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .ToCharArray(); private static Random _random = new Random(); public static string GetBase62(int length) { var sb = new StringBuilder(length); for (int i=0; i<length; i++) sb.Append(_base62chars[_random.Next(62)]); return sb.ToString(); } public static string GetBase36(int length) { var sb = new StringBuilder(length); for (int i=0; i<length; i++) sb.Append(_base62chars[_random.Next(36)]); return sb.ToString(); } }
Выход:
источник
Я рекомендую http://hashids.org/, который преобразует любое число (например, идентификатор БД) в строку (с использованием соли).
Это позволяет декодировать эту строку обратно в число. Таким образом, вам не нужно хранить его в базе данных.
Имеет библиотеки для JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Objective-C, C, C ++ 11, Go, Erlang, Lua, Elixir, ColdFusion, Groovy, Kotlin, Nim, VBA, CoffeeScript и для Node.js и .NET.
источник
У меня были те же требования, что и у ОП. Я просмотрел доступные библиотеки, но большинство из них основаны на случайности, и я этого не хотел. На самом деле я не мог найти ничего, что не было бы основано на случайном и все еще очень короткое ... Так что я закончил свой собственный, основанный на методе, который использует Flickr , но модифицированный, чтобы требовать меньшей координации и допускать более длительные периоды автономной работы.
Короче говоря:
Недостатки:
Преимущества
Я опубликовал как библиотеку Javascript для клиентской стороны, так и реализацию сервера Java EE. Внедрение серверов на других языках также должно быть простым.
Вот проекты:
suid - Распределенные сервисные уникальные идентификаторы, короткие и удобные
suid-server-java - реализация Suid-сервера для стека технологий Java EE.
Обе библиотеки доступны по либеральной лицензии Creative Commons с открытым исходным кодом. Надеюсь, это поможет кому-то другому в поиске коротких уникальных идентификаторов.
источник
suid
?Я использовал базу 36, когда решил эту проблему для приложения, которое разрабатывал пару лет назад. Мне нужно было сгенерировать удобочитаемый разумно уникальный номер (во всяком случае, в текущем календарном году). Я решил использовать время в миллисекундах от полуночи 1 января текущего года (чтобы каждый год метки времени могли дублироваться) и преобразовал его в число с основанием 36. Если разрабатываемая система сталкивалась с фатальной проблемой, она генерировала число с основанием 36 (7 символов), которое отображалось конечному пользователю через веб-интерфейс, который затем мог передать возникшую проблему (и номер) сотруднику службы технической поддержки (который затем можно было бы использовать его, чтобы найти точку в журналах, где началась трассировка стека). Число вроде 56af42g7пользователю бесконечно легче читать и передавать, чем временная метка, например 2016-01-21T15: 34: 29.933-08: 00, или случайный UUID, например 5f0d3e0c-da96-11e5-b5d2-0a1d41d68578 .
источник
Мне очень нравится простота кодирования GUID с использованием формата Base64 и усечения завершающего ==, чтобы получить строку из 22 символов (требуется одна строка кода, и вы всегда можете преобразовать ее обратно в GUID). К сожалению, он иногда включает символы + и /. Хорошо для базы данных, не очень хорошо для URL-адресов, но это помогло мне оценить другие ответы :-)
С https://www.codeproject.com/Tips/1236704/Reducing-the-string-Length-of-a-Guid Кристиана ван Бергена
var newGuid = Guid.NewGuid(); var messageID = Convert.ToBase64String(newGuid.ToByteArray()); var message22chars = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0,22);
источник