Generate CUIDs in VB.Net

Resources  |  Generate CUIDs in VB.Net

Generating a CUID (Collision-resistant Unique Identifier) in VB.Net involves using techniques such as the current timestamp, a counter, a machine fingerprint, and randomness. Below is an example implementation of generating a CUID in VB.Net.

Steps to Generate a CUID in VB.Net

  1. Timestamp: Get the current timestamp in milliseconds.
  2. Counter: Use a counter to handle multiple CUIDs generated in a short period.
  3. Fingerprint: Generate a machine-specific fingerprint.
  4. Randomness: Add random characters to further reduce the risk of collisions.
  5. Base36 Encoding: Encode the components using Base36 for readability.

Example Code

Here's a VB.Net implementation to generate a CUID:

Imports System.Security.Cryptography
Imports System.Text
Imports System.Threading

Public Class CUIDGenerator
    Private Shared ReadOnly Base36Chars As String = "0123456789abcdefghijklmnopqrstuvwxyz"
    Private Shared counter As Integer = 0
    Private Shared lastTimestamp As Long = 0
    Private Shared ReadOnly rng As New Random()

    Private Shared Function EncodeBase36(value As Long) As String
        If value = 0 Then
            Return "0"
        End If

        Dim result As New StringBuilder()
        While value > 0
            result.Insert(0, Base36Chars(CInt(value Mod 36)))
            value \= 36
        End While

        Return result.ToString().PadLeft(8, "0"c)
    End Function

    Private Shared Function GetMachineFingerprint() As String
        Try
            Dim hostname As String = Environment.MachineName
            Dim md5 As MD5 = MD5.Create()
            Dim hashBytes As Byte() = md5.ComputeHash(Encoding.UTF8.GetBytes(hostname))
            Dim sb As New StringBuilder()
            For i As Integer = 0 To 3
                sb.Append(hashBytes(i).ToString("x2"))
            Next
            Return sb.ToString()
        Catch ex As Exception
            Return "0000"
        End Try
    End Function

    Private Shared Function GetRandomString(length As Integer) As String
        Dim result As New StringBuilder()
        For i As Integer = 0 To length - 1
            result.Append(Base36Chars(rng.Next(0, 36)))
        Next
        Return result.ToString()
    End Function

    Public Shared Function GenerateCUID() As String
        Dim timestamp As Long = DateTime.UtcNow.Ticks \ TimeSpan.TicksPerMillisecond

        If timestamp = lastTimestamp Then
            counter += 1
        Else
            lastTimestamp = timestamp
            counter = 0
        End If

        Dim timestampBase36 As String = EncodeBase36(timestamp)
        Dim counterBase36 As String = EncodeBase36(counter)
        Dim fingerprint As String = GetMachineFingerprint()
        Dim randomString As String = GetRandomString(4)

        Return $"c{timestampBase36}{counterBase36}{fingerprint}{randomString}"
    End Function
End Class

Module Program
    Sub Main(args As String())
        Console.WriteLine(CUIDGenerator.GenerateCUID())
    End Sub
End Module

Explanation

  1. Base36 Encoding:

    • The EncodeBase36 function converts a number to a Base36 encoded string, ensuring it is padded to 8 characters.
  2. Timestamp:

    • DateTime.UtcNow.Ticks \ TimeSpan.TicksPerMillisecond gets the current timestamp in milliseconds.
  3. Counter:

    • A shared counter variable and a lastTimestamp variable are used to handle multiple CUIDs generated within the same millisecond.
  4. Machine Fingerprint:

    • GetMachineFingerprint fetches the machine's hostname, computes an MD5 hash of it, and returns the first 4 hexadecimal characters of the hash.
  5. Random String:

    • GetRandomString generates a random string of specified length (4 characters) using characters from Base36Chars.
  6. Combine Components:

    • The GenerateCUID function combines the timestamp, counter, fingerprint, and random parts to form the final CUID.

Summary

This VB.Net implementation of CUID generation uses standard .Net libraries (System.Security.Cryptography for hashing and System.Text for string operations) and built-in functionalities to handle timestamps, hashing, randomness, and counters. This approach ensures that the generated CUIDs are unique, readable, and collision-resistant, suitable for various applications. Adjustments can be made based on specific requirements, such as handling errors when fetching the machine's hostname or modifying the length of the random string portion.