-
-
Save vanbukin/01cdeee273d332e0dd006db274702886 to your computer and use it in GitHub Desktop.
MySqlTest (initial)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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