2015-12-15 7 views
0

Существует ли альтернативная библиотека, доступная в C# или алгоритме, которая генерирует уникальное значение аналогичным образом, используя vfp с помощью команды sys 2015.Альтернатива команде sys 2015 vfp

ответ

0

Уникальные идентификаторы могут быть созданы различными способами. SYS(2015) уникален только в рамках данного процесса, и вы можете получить его, поставив глобальный счетчик целых чисел в критическом разделе.

Если вы хотите что-то похожее на SYS(2015), тогда вы можете использовать GetSystemTimeAsFileTime(), сохраняя последнее выданное значение в глобальной переменной, защищенной критическим разделом. Если текущее значение не больше последнего значения, увеличьте последнее значение и верните его. Таким образом, идентификатор может немного отставать от текущего времени, если есть высокая конкуренция, но реальное время догонит в медленные периоды. В качестве кодировки вы можете использовать base64, stripping '=' и подстановку символов '/' и '+' соответствующим образом.

Если вы хотите создать имена файлов, которые вероятно быть уникальными на данную машине, то вы можете сделать много хуже, чем хэшировании конкатенации имени машины, идентификатор процесса, идентификатор потока и системное время (UNC, как FILETIME) , Вы можете использовать левые восемь символов представления base64 хэша (после подстановки чего-то типа «$» и «_» для «/» и «+») для получения имен, которые могут использоваться как идентификаторы, имена столбцов и т. Д. , Эти имена не уникальны - они имеют относительно низкую вероятность столкновения. Используя больше символов хэша в имени, вы можете получить вероятность столкновения как можно ниже.

Другим способом является использование вышеупомянутой конкатенации непосредственно после выполнения форматирования и подстановки, чтобы сделать ее совместимой с вашим предполагаемым доменом имени. Например. преобразовать идентификатор процесса, идентификатор потока и UNC-файл времени генерации id в hex и вставить подходящие разделители. Тогда у вас есть идентификаторы, которые гарантированно будут уникальными по всей сети, если имена машин уникальны.

Если вам нужны короткие имена, которые гарантированно будут уникальными на данной машине или сети, вы можете использовать глобальный счетчик, защищенный подходящим механизмом IPC. Самый простой способ сделать это - положить счетчик в таблицу и полагаться на механизм базы данных (например, FoxPro) для необходимого IPC.

Или вы можете поместить счетчик в файл .ini и использовать блокировку диапазона байтов Win32 или файлы мьютекса (кто бы ни смог создать пустой эксклюзивный файл mutex, имеет блокировку на .ini).

Еще один вариант - использовать двоичный файл, который - по чистому совпадению - выглядит как действительный .DBF-файл и использовать протокол блокировки, который - по чистому совпадению - совместим с протоколом блокировки VFP. Это означает, что даже C# или Delphi могут получать целые идентификаторы из таблицы идентификаторов, которые VFP управляет своим собственным способом Foxy. Я использую такой модуль в производстве, в сочетании с методом доступа к общей памяти (только голый InterlockedIncrement() для получения нового идентификатора), который может использоваться, если все пользователи работают на одном компьютере.

Возможности практически бесконечны, но конкретные рекомендации могут быть сделаны только в том случае, если известны конкретные требования.

0

Один, что даже лучше, чем SYS (2015) является:

var uniqueValue = Guid.NewGuid(); 

 Смежные вопросы

  • Нет связанных вопросов^_^