Burst Ulid
Ulid implemented using burst
com.libsugar.unity.burstulid 
Install via UPM
Add to Unity Package Manager using this URL
https://www.pkglnk.dev/burstulid.git?path=Assets/Ulid README Markdown
Copy this to your project's README.md
## Installation
Add **Burst Ulid** to your Unity project via Package Manager:
1. Open **Window > Package Manager**
2. Click **+** > **Add package from git URL**
3. Enter:
```
https://www.pkglnk.dev/burstulid.git?path=Assets%2FUlid
```
[](https://www.pkglnk.dev/pkg/burstulid)README
BurstUlid
Ulid implemented using burst

Installation
Unity Package by npmjs
Edit your
Packages/manifest.jsonfile like this{ "scopedRegistries": [ { "name": "npm", "url": "https://registry.npmjs.org", "scopes": [ "com.libsugar" ] } ], "dependencies": { "com.libsugar.unity.burstulid": "<version>" } }or use gui in unity editor
configProject Settings -> Package Manager -> Scoped Registeries
then add package in package manager
How to use
// create
var ulid = BurstUlid.NewUlid();
// use an external randomizer
var rand = new Random(seed);
var ulid = BurstUlid.NewUlid(ref rand);
// random by RNGCryptoServiceProvider
var ulid = BurstUlid.NewUlidCryptoRand();
// to string in managed
var str = ulid.ToString();
// to string in burst
FixedString32Bytes str = ulid.ToFixedString();
// cast to guid
var guid = ulid.ToGuid();
// cast from guid
var ulid = BurstUlid.FromGuid(guid);
// parse string
var ulid = BurstUlid.Parse(str);
// try parse string
if (BurstUlid.TryParse(str, out var ulid)) {}
// get net format (big endian)
v128 net = ulid.ToNetFormat();
Tips
This package does not require a dependency in
package.json,
you need to manually ensure ↓ dependencies existUnity.BurstUnity.MathematicsUnity.CollectionsSystem.Runtime.CompilerServices.UnsafeSystem.Text.Json(optional)
This implementation is not fully compliant with the Ulid Standard
No monotonicity
Memory layout uses little endian
You can convert to big endian using
ToNetFormatorWriteNetFormatBytesvar ulid = BurstUlid.NewUlid(); v128 net_format = ulid.ToNetFormat();Binary layout in memory (if memory is Little-Endian)
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 32_bit_uint_time_low_0123 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 16_bit_uint_time_high_45 | 16_bit_uint_random_01 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 32_bit_uint_random_2345 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 32_bit_uint_random_6789 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Binary layout in net (and ulid stand)
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 32_bit_uint_time_high_5432 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 16_bit_uint_time_low_10 | 16_bit_uint_random_98 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 32_bit_uint_random_7654 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 32_bit_uint_random_3210 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Because some magic is used to bypass the limitation that burst cannot call managed code, so if you want to use it before
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)], you need to callInitStaticmanuallyBurstUlid.InitStatic();Use in general unity life cycle, such as
Awake,Start,Updatecan ignore this promotion
Benchmark

No comments yet. Be the first!