Каков предпочтительный метод для генерации локально уникальных идентификаторов в VB.NET? - PullRequest
1 голос
/ 01 сентября 2010

Я ищу способ создания уникальных идентификаторов для класса записей, создаваемых локально, а затем сохраняемых в различных форматах (XML, SQL и т. Д.)

Я видел людей, использующих DateTime и GetHashCode, но это, кажется, поддается дублированию идентификаторов в зависимости от размера выборки.

GUID немного излишним, так как мне не нужно ничего такого уникального (большого) на глобальном уровне.Мне также известно об использовании идентификаторов GUID и GetHashCode для небольшого уменьшения размера, но здесь также часто встречаются дубликаты.

Кто-нибудь может предложить лучший метод или метод для генерации простых уникальных идентификаторов?

Ответы [ 3 ]

5 голосов
/ 01 сентября 2010

Это почти всегда ошибка, чтобы реализовать свой собственный. Маленькие уникальные номера требуют действительно надежной записи последнего использованного номера. Это трудно понять, на жестких дисках случаются сбои головок, иногда случаются повреждения реестров. Вы должны будете организовать это так, чтобы была единственная точка отказа. Аналогично автоинкрементному столбцу базы данных. Убедитесь, что в случае потери последнего номера также произошла полная потеря данных. С одной стороны, это означает, что у пользователя не должно быть способа копировать данные, не копируя также запись последнего номера. Или что у вас всегда есть надежная копия всех данных и вы можете восстановить последний номер из них. Быстро.

Вам также будет трудно убедиться, что число увеличивается атомно. Достаточно просто запустить два экземпляра вашей программы, чтобы вызвать хаос. Исправить это сложно, вам понадобится независимый арбитр, который хранит число.

Тогда есть бремя угадывать, что произойдет через 10 или 20 лет. Будет ли ваше приложение масштабироваться в соответствии с требованиями к тому времени? Это очень редко, рассчитывать на то, что машины становятся быстрее, с этим покончено. То, что местному уникальному номеру теперь нужно, становится глобально уникальным номером. Очень различные требования к этому.

Не облажайся, 16 байтов - ничто. Используйте Guid.

5 голосов
/ 01 сентября 2010

Направляющий или увеличивающий счетчик.

Guid может генерироваться "из воздуха", но занимает больше места

Для счетчика вам нужно где-то хранить счетчик, и вам нужно будет сделать его безопасным для потоков, если вы используете потоки. Но он меньше по размеру.

1 голос
/ 01 сентября 2010

GetHashCode определенно не очень хороший выбор.

Насколько большим вы хотите, чтобы идентификатор был?

Если у вас есть постоянное хранилище для запоминания «последнего сгенерированного» идентификатора (например, базы данных), то достаточно просто увеличивать число каждый раз. Если у вас нет постоянного хранилища, тогда используйте DateTime для получения количества миллисекунд, так как некоторая фиксированная дата также будет работать. Это, очевидно, ограничит вас возможностью генерировать только один идентификатор в миллисекунду, но в зависимости от вашей ситуации это будет нормально.

Вы можете объединить метку времени с вашим идентификатором процесса или чем-то еще, чтобы избежать дублирования, если у вас есть несколько процессов, генерирующих идентификаторы одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...