Skip to content

GUIDs

Granit.Guids provides IGuidGenerator with three strategies for generating identifiers optimized for database performance. The default — UUIDv7 — uses Guid.CreateVersion7() from .NET 9: a standard time-ordered format that appends rows to the last index page and eliminates B-tree page splits on PostgreSQL, MySQL, and SQL Server 2019+.

PackageRoleDepends on
Granit.GuidsIGuidGenerator, UUIDv7 / sequential / random strategiesGranit.Timing
[DependsOn(typeof(GranitGuidsModule))]
public class AppModule : GranitModule { }
public class PatientService(IGuidGenerator guidGenerator, AppDbContext db)
{
public Patient Create(string firstName, string lastName)
{
return new Patient
{
Id = guidGenerator.Create(), // UUIDv7 by default
FirstName = firstName,
LastName = lastName,
};
}
}

Three strategies are available via GuidStrategy:

StrategyImplementationWhen to use
UuidV7 (default)Guid.CreateVersion7(DateTimeOffset)PostgreSQL, MySQL, SQL Server 2019+, any modern DB
SequentialSequentialGuidGenerator (custom byte layout)Oracle, pre-2019 SQL Server
RandomGuid.NewGuid()Public-facing IDs where enumeration must be prevented
block-beta
    columns 16
    block:v7["UUIDv7 (default)"]
        columns 16
        t1["T"] t2["T"] t3["T"] t4["T"] t5["T"] t6["T"]
        v["ver"] r1["R"] r2["R"] r3["R"] r4["R"] r5["R"] r6["R"] r7["R"] r8["R"] r9["R"]
    end

    style t1 fill:#4a9eff
    style t2 fill:#4a9eff
    style t3 fill:#4a9eff
    style t4 fill:#4a9eff
    style t5 fill:#4a9eff
    style t6 fill:#4a9eff
    style v fill:#f0a500

T = 48-bit Unix timestamp (milliseconds), ver = version nibble (7), R = random.

Legacy sequential types (Strategy = Sequential)

Section titled “Legacy sequential types (Strategy = Sequential)”

Used when Strategy = GuidStrategy.Sequential. The byte layout is tuned per database engine:

SequentialGuidTypeTimestamp positionDatabase
SequentialAsStringFront (sorted by string representation)PostgreSQL, MySQL
SequentialAsBinaryFront (sorted by byte array)Oracle
SequentialAtEndEnd (Data4 block)SQL Server pre-2019
// Default — UUIDv7, recommended for modern databases
services.AddGranitGuids();
// SQL Server 2019+ — still use UUIDv7
services.AddGranitGuids();
// Oracle — legacy sequential
services.AddGranitGuids(options =>
{
options.Strategy = GuidStrategy.Sequential;
options.DefaultSequentialGuidType = SequentialGuidType.SequentialAsBinary;
});
// Pre-2019 SQL Server — legacy sequential
services.AddGranitGuids(options =>
{
options.Strategy = GuidStrategy.Sequential;
options.DefaultSequentialGuidType = SequentialGuidType.SequentialAtEnd;
});
// Public-facing IDs — random
services.AddGranitGuids(options =>
{
options.Strategy = GuidStrategy.Random;
});
PropertyTypeDefaultDescription
StrategyGuidStrategyUuidV7Generator strategy
DefaultSequentialGuidTypeSequentialGuidType?SequentialAsStringByte layout for Sequential strategy
public interface IGuidGenerator
{
Guid Create();
}

All three implementations are singletons. TryAddSingleton is used — register a custom IGuidGenerator before calling AddGranitGuids() to override the default.

SimpleGuidGenerator.Instance is also available as a static instance for non-DI contexts (domain events, value objects).

CategoryKey typesPackage
ModuleGranitGuidsModule
StrategiesGuidStrategyGranit.Guids
GeneratorsIGuidGenerator, UuidV7GuidGenerator, SequentialGuidGenerator, SimpleGuidGeneratorGranit.Guids
OptionsGuidGeneratorOptions, SequentialGuidTypeGranit.Guids
ExtensionsAddGranitGuids()Granit.Guids