Vb.net 在构造函数中自动生成唯一ID

Vb.net 在构造函数中自动生成唯一ID,vb.net,constructor,Vb.net,Constructor,使用VB.net创建名为staff的新类,该类具有三个属性: Name、LastName、ID-应适合用作数据库中的主键 提供一个类构造函数来填充Name和LastName。ID应该在构造函数中自动生成,不应该传入 我知道如何创建类、属性和构造函数,我只需要知道如何在构造函数中自动生成ID字段。有可能这样做吗 我通常要做的是将数据库中的id字段设置为identity字段和主键,这样它会自动插入下一个可用的id,或者在我的应用程序中,我从数据库中读取最后一个id并将其添加到其中。但是我需要知道如何

使用VB.net创建名为staff的新类,该类具有三个属性: Name、LastName、ID-应适合用作数据库中的主键

提供一个类构造函数来填充Name和LastName。ID应该在构造函数中自动生成,不应该传入

我知道如何创建类、属性和构造函数,我只需要知道如何在构造函数中自动生成ID字段。有可能这样做吗

我通常要做的是将数据库中的id字段设置为identity字段和主键,这样它会自动插入下一个可用的id,或者在我的应用程序中,我从数据库中读取最后一个id并将其添加到其中。但是我需要知道如何在构造函数中自动生成ID字段。

Guid 如果对ID类型没有任何约束,则可以使用GUID:

Dim id As Guid = Guid.NewGuid()
您甚至可以将其保留为字符串:

Dim id As String = Guid.NewGuid().ToString("N")
它应该被授予在不同的机器上是唯一的(以满足您的需求,即它必须适合用作数据库中的主键)。另见

时间戳 更糟糕的情况是,如果您没有这样严格的要求(网络中的唯一性),您可以使用时间戳。当然,在这种情况下,你必须考虑更多的问题:

  • 法定时间:时间每年来回两次
  • 区域:如果用户在伦敦输入数据,然后他搬到纽约怎么办
  • 并发性:您必须假设没有其他人将记录添加到您的数据库中(如果它们使用不同的技术,则可能会发生冲突)。如果执行是并发的(程序的多个实例同时运行),您也不能应用此方法
  • 计时器粒度:系统日期的粒度较粗:如果您在短时间内构造了许多对象,则可能会有重复的ID。解决方法
柜台 如果满足所有这些条件:

  • 应用程序的多个实例不会并行运行
  • 您使用的是一台计算机(不是网络)
  • 每次应用程序启动时,数据库都是空的
每次构造新对象时,可以使用递增的
Shared
计数器。如果系统计时器粒度不是问题(请参阅关于时间戳的段落),您可以将其用作ID。由于粒度的限制,即使同一应用程序的多个实例同时运行,它也应该可以工作

如果使用
共享
字段,则必须处理同步问题。按照中的建议,您可以使用
同步锁
。作为替代方案,您可以使用
联锁.Increment
操作

散列码 如果计数器的所有条件都满足,并且此条件也满足:

  • 您的应用程序是32位的
  • 您的对象不是
    ValueType
    ,并且它不重写
    GetHashCode()
    方法
您可以使用哈希代码(通过
GetHashCode()
获得),因为(从):

换句话说,ReferenceEquals方法返回true的两个对象具有相同的哈希代码

因为
Object.ReferenceEquals()
只在比较同一实例时返回
true
,所以每个实例都有一个唯一的哈希代码(因为在32位应用程序中,哈希代码是对象引用本身)。请注意,这是一个实施细节,可能会发生变化

随机数 我知道这可能会让人震惊,但一个好的64位随机数生成器的冲突概率非常低。我重复非常非常低的概率(有关更多数学细节,请参阅)。不要使用
System.Random
进行此操作


根据您使用的种子,您可能也能够在网络场景中生成随机数(不要忘记-需要引用-一个本地网络协议的早期草案建议使用32位随机数作为地址,由于用户的不良反馈,它已被更改,但这并不意味着它无法工作).

你想要一个永远不会重复的数字!那为什么不直接用这个呢

    Dim dateAndTime As Date
    dateAndTime = Now
    TextBoxPID.Text = Format(dateAndTime, "yyyyMMddHHmmss").ToString
除非数据输入以毫秒为单位,否则此解决方案非常有效。如果遇到毫秒问题,只需在字符串末尾添加一个计数器

    counter +=1
    TextBoxPID.Text = Format(dateAndTime, "yyyyMMddHHmmss").ToString & counter.ToString
如果您在网络上工作,并且有几个人在做数据输入,那么将他们的员工id添加到字符串中。每个问题都有简单的解决方案,但在大多数情况下(如果不是所有情况的话),这将不会产生问题。

根据SNTP服务器生成随机唯一的用户ID。 我的要求有点不同;然而,我需要生成一个随机且唯一的用户ID,即10个数字,花费大量时间无法找到合适的解决方案。 因此,我最终得到了以下函数:;它的唯一性和随机性结果

根据一台试验机上的一个应用瞬间,它是增量唯一结果;因为用户将在非预选时间戳上一次性生成十位数字。除了玩随机字母前缀;我希望此功能可以提供一个解决方案:

Imports System.Globalization
Imports System.Net

Public Class GetNetTime
    Public Shared Function GetUTC()
        ' connect to google servers
        ' you could use some SNTP time servers but can't be sure port will be open
        ' or you could just ping your own webserver
        Dim myNetRequest As WebRequest = HttpWebRequest.Create("http://www.example.com")
        ' read response header from connection
        Dim response = myNetRequest.GetResponse()
        ' read date/time header
        ' assume its UTC format
        Dim GlobalUTC As String = response.Headers("date").ToString
        ' convert string to datetime object
        Dim parsedDateTime As DateTime = DateTime.Parse(GlobalUTC)
        ' get UNIX time stamp
        Dim unixTime = (parsedDateTime - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
        Return unixTime 
    End Function
End Class
要测试输出,可以添加:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim utc As String = GetNetTime.GetUTC
        ' add random alpha prefix to UNIX time stamp
        Dim sPrefix As String = ""
        Dim rdm As New Random()
        For i As Integer = 1 To 3 ' if you need more than 3 alpah random charachters adjust i length
            sPrefix &= ChrW(rdm.Next(65, 90))
        Next
        MsgBox(sPrefix & utc) ' OR MsgBox("ID" & sPrefix & utc)
        ' code here to use result
    End Sub
我发现这个解决方案比查询SQL表、读取最后一个记录id和执行增量更有用

注释

  • 请不要介意冗长的回答;当我试图注释代码和 详细解释场景
  • 我认为这有利于发电 在多个工作站上运行的应用程序的用户ID
  • 请不要将该函数用于。。。循环或排气运行。
输出示例:

GYK1501270543

VWT1501270606

WRH1501270634

SKI1501270648

QXL1501270716

这也是基于上面的@wpcoder答案,但这是一个基本的形式,这一个适合我

    Public Function UIDGen(ByRef f As String) As String
        Dim currentTime As DateTime = DateTime.UtcNow
        Dim StringTime As String = currentTime.ToString
        Dim parsedDateTime As DateTime = DateTime.Parse(StringTime)
        Dim unixTime = (parsedDateTime - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
        Dim utcString As String = unixTime.ToString
        Dim sPrefix As String = ""
        Dim rdm As New Random()

        For i As Integer = 1 To 3 ' 3 Letters enough ?
            sPrefix &= ChrW(rdm.Next(65, 90))
        Next
        f = (sPrefix & utcString)
        Return f
    End Function

构造器中生成的ID是否只需要在内存中的所有对象中唯一,还是在已经存储到DB的所有对象中唯一?它需要在DB中唯一,正如问题所说,它应该适合于