替代sys 2015 vfp命令

时间:2015-12-15 14:03:38

标签: c# visual-foxpro foxpro

c#或算法中是否有可用的备用库,它以与vfp使用sys 2015命令类似的方式生成唯一值。

2 个答案:

答案 0 :(得分:0)

可以通过多种不同方式生成唯一ID。 SYS(2015)仅在给定进程中是唯一的,您可以通过在临界区中放置一个全局整数计数器来实现。

如果你想要看起来类似于SYS(2015)的东西,那么你可以使用GetSystemTimeAsFileTime(),将最后分配的值存储在受关键部分保护的全局变量中。如果当前值不大于最后一个值,则递增最后一个值并返回该值。通过这种方式,如果存在高争用,则id可以比当前时间稍微运行,但是实时将在慢速期间赶上。作为编码,您可以使用base64,剥离' ='并代替字符' /'和' +'以合适的方式。

如果你想创建可能的文件名在给定的机器上是唯一的,那么你可以比散列机器名,进程ID,线程ID和系统时间的连接更糟糕( UNC作为文件时间)。您可以使用哈希的base64表示的左八个字符(在替换' $'和' _'之后用于' /'和&# 39; +')获取可用作标识符,列名等的名称。这些名称并不是唯一的 - 它们碰撞的可能性相对较低。通过在名称中使用更多哈希字符,您可以将碰撞的可能性降低到所需的最低值。

另一种方法是在进行一些格式化和替换以使其与您的预期名称域兼容后,直接使用上述连接。例如。将进程id,线程ID和id生成的UNC文件时间转换为十六进制,并插入合适的分隔符。然后,只要机器名称是唯一的,就可以保证网络中的ID是唯一的。

如果您需要在给定计算机或网络上保证唯一的短名称,则可以使用受适当IPC机制保护的全局计数器。最简单的方法是将计数器放入表中,并依赖数据库引擎(例如FoxPro)进行必要的IPC。

或者您可以将计数器放入.ini文件并使用Win32字节范围锁定或互斥文件(无论谁设法创建空的独占互斥锁文件都锁定.ini)。

另一个选择是使用二进制文件 - 纯粹巧合 - 看起来像一个有效的.DBF文件,并使用一个锁定协议 - 纯粹巧合 - 与VFP的锁定协议兼容。这意味着即使C#或Delphi也可以从VFP以自己的Foxy方式管理的id表中获取整数ID。我在生产中使用这样的模块,结合共享内存访问方法(只是一个用于获取新id的裸InterlockedIncrement()),如果所有使用者都在同一台机器上运行,则可以使用该方法。

可能性几乎是无穷无尽的,但只有在了解具体要求时才能提出具体建议。

答案 1 :(得分:0)

甚至比sys(2015)更好的是:

var uniqueValue = Guid.NewGuid();