Skip to content

Instantly share code, notes, and snippets.

@vanbukin
Created June 18, 2024 23:10
Show Gist options
  • Save vanbukin/01cdeee273d332e0dd006db274702886 to your computer and use it in GitHub Desktop.
Save vanbukin/01cdeee273d332e0dd006db274702886 to your computer and use it in GitHub Desktop.
MySqlTest (initial)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MySqlConnector" Version="2.3.7" />
</ItemGroup>
</Project>
using System.Buffers.Binary;
using System.Data;
using System.Security.Cryptography;
using MySqlConnector;
namespace MySqlTest;
public static class Program
{
private const string ConnectionString = "Server=localhost;Port=3306;User ID=root;Password=root;Database=dotnet";
static async Task Main(string[] args)
{
await UploadUuidsAsync(100_000);
Console.WriteLine("Done");
}
static async Task UploadUuidsAsync(int uuidsCount)
{
const string Sql = "INSERT INTO `uuids` (`uuid`, `order`) VALUES (@uuid, @order);";
var connection = new MySqlConnection(ConnectionString);
await connection.OpenAsync();
await using var transaction = await connection.BeginTransactionAsync(IsolationLevel.ReadCommitted);
for (var i = 0; i < uuidsCount; i++)
{
var uuid = new Guid(GenerateUuidV7());
var order = i;
await using var cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = Sql;
cmd.Parameters.AddWithValue("@uuid", uuid);
cmd.Parameters.AddWithValue("@order", order);
await cmd.ExecuteNonQueryAsync();
}
await transaction.CommitAsync();
}
static string GenerateUuidV7()
{
Span<byte> uuidv7 = stackalloc byte[16];
ulong unixTimeTicks = (ulong)DateTimeOffset.UtcNow.Subtract(DateTimeOffset.UnixEpoch).Ticks;
ulong unixTsMs = (unixTimeTicks & 0x0FFFFFFFFFFFF000) << 4;
ulong unixTsMsVer = unixTsMs | 0b0111UL << 12;
ulong randA = unixTimeTicks & 0x0000000000000FFF;
// merge "unix_ts_ms", "ver" and "rand_a"
ulong hi = unixTsMsVer | randA;
BinaryPrimitives.WriteUInt64BigEndian(uuidv7, hi);
// fill "rand_b" and "var"
RandomNumberGenerator.Fill(uuidv7[8..]);
// set "var"
byte varOctet = uuidv7[8];
varOctet = (byte)(varOctet & 0b00111111);
varOctet = (byte)(varOctet | 0b10111111);
uuidv7[8] = varOctet;
return Convert.ToHexString(uuidv7);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment