Skip to content

Latest commit

 

History

History
138 lines (103 loc) · 4.49 KB

README.CN.md

File metadata and controls

138 lines (103 loc) · 4.49 KB

BurstUlid

NPM openupm MIT

使用 Burst 实现的 Ulid

ulid

安装

  • Unity Package 由 npmjs

    如下编辑你的 Packages/manifest.json 文件

    {
      "scopedRegistries": [
        {
          "name": "npm",
          "url": "https://registry.npmjs.org",
          "scopes": [
            "com.libsugar"
          ]
        }
      ],
      "dependencies": {
        "com.libsugar.unity.burstulid": "<version>"
      }
    }

    或者在 unity 编辑器中操作
    配置 Project Settings -> Package Manager -> Scoped Registeries
    然后在包管理器中添加包

用法

// 创建
var ulid = BurstUlid.NewUlid();

// 使用外部随机器
var rand = new Random(seed);
var ulid = BurstUlid.NewUlid(ref rand);

// 使用 RNGCryptoServiceProvider 随机
var ulid = BurstUlid.NewUlidCryptoRand();

// 托管 to string
var str = ulid.ToString();

// burst 编译 to string
FixedString32Bytes str = ulid.ToFixedString();

// 转换成 guid
var guid = ulid.ToGuid();

// 从 guid 转回来
var ulid = BurstUlid.FromGuid(guid);

// 解析字符串
var ulid = BurstUlid.Parse(str);

// 尝试解析字符串
if (BurstUlid.TryParse(str, out var ulid)) {}

// 获取网络格式 (大端序)
v128 net = ulid.ToNetFormat();

提示

  • 此包没有在 package.json 内要求依赖项,
    你需要手动确保 ↓ 依赖项存在

    • Unity.Burst
    • Unity.Mathematics
    • Unity.Collections
    • System.Runtime.CompilerServices.Unsafe
    • System.Text.Json (optional)
  • 此实现不完全符合 Ulid 标准

    • 没有 单调性 (monotonicity)

    • 内存布局使用小端序

      你可以使用 ToNetFormatWriteNetFormatBytes 转换成大端序

      var ulid = BurstUlid.NewUlid();
      v128 net_format = ulid.ToNetFormat();
      • 内存中的二进制布局 (如果内存是小端序的)

        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                   |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        
      • 网络中的二进制布局 (以及 ulid 标准)

        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                   |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        
  • 因为用了一些魔法来绕过 burst 不能调用托管代码的限制,所以如果你想在 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] 之前使用, 你需要手动调用 InitStatic

    BurstUlid.InitStatic();

    在一般的 unity 生命周期中使用, 比如 AwakeStartUpdate, 可以忽略此条提示

基准测试

基准