Puid

简单、快速、灵活和高效地生成大概唯一的标识符 (puid,也称为随机字符串),这些标识符具有直观指定的熵,并使用预定义的或自定义的字符。

import Puid

let alphaId = try Puid(total: 1e5, risk: 1e12, chars: .alpha)
try alphaId.generate()
// => "uTJtdTPQFk"


目录

概述

Puid 提供了对随机 ID 生成所有重要方面的完全、显式控制:熵源字符 和所需的 随机性总体概述 详细介绍了与所有 PUID 实现相关的信息。

目录

用法

使用 Puid 创建随机 ID 生成器非常简单,只需

import Puid

let sessionId = try Puid()
try sessionId.generate()
// => "1Uyt1bj-cAgsHRpWjyPya6"

选项允许轻松且完全地控制随机 ID 生成。上面的例子使用了以下各项的默认值

这些默认值适用于 Web 会话 ID。

目录

熵源

Puid 通过 entropy 选项提供 CSPRNG 熵源 (Puid.Entropy.System.csprng,使用 SecCopyRandomBytes) 和 PRNG 熵源 (Puid.Entropy.System.prng,使用 UInt64.random)

let prngId = try Puid(entropy: .prng)
try prngId.generate()
// => "WONlvSz5wRzw6GUz1LqDTK"

entropy 选项还可以指定 PuidEntropySource 协议的任何实现,以使用自定义熵源

let fixedBytes = Puid.Entropy.Fixed(hex: "d0 52 91 fd 13 62 16 fc bc 52 57 d1 a9 17 42 bf bf")
let fixedId = try Puid(entropy: fixedBytes)
try fixedId.generate()
// => "0FKR_RNiFvy8UlfRqRdCv7"

注意:Puid.Entropy.Fixed 源对于确定性测试很方便,但不适用于一般用途。

一个便利类 Puid.Entropy.Source 提供了一种使用任何 RandomNumberGenerator 实现作为 PuidEntropySource 的方法。例如,如果您有一个最喜欢的 PRNG,比如 FavePrng,它通过初始化种子生成一个可重复的随机 UInt64 数字序列,您可以使用该 PRNG 作为熵源

let favePrng = Puid.Entropy.Source(using: FavePrng(seed: 42))
let prngId = try Puid(entropy: favePrng)
try prngId.generate()
// => A puid generated using bytes from the custom FavePrng entropy source

目录

字符

ID 生成中使用的字符使用 chars 选项指定。Puid 提供了 17 个预定义字符集,以及一个指定任何唯一字符集的选项

let alphaNumId = try Puid(chars: .alphaNum)
try alphaNumId.generate()
// => "cjm7wFkJQW5igrWUdjFnaA"

let customId = try Puid(chars: .custom("customID_CHARS"))
try customId.generate()
// => "oRmcAACtHsuAIuDSsooItACHIICo_S_IHo"

注意:Puid 验证自定义 chars 是唯一的,以最大限度地提高 ID 生成过程中捕获的熵。

目录

随机性

随机 ID 生成的一个关键方面,当然是生成的 ID 的随机性。Puid 通过 bits 选项直接指定 ID 随机性,适用于诸如会话 ID(建议为 128 位)或 256 位安全令牌之类的情况。但是,更通用、直观的随机性声明是显式指定实际需要的 ID total 总数,并分配可接受的重复 risk 风险。

let randId = try Puid(total: 1e5, risk: 1e12, chars: .safe32)
try randId.generate()
// => "dqHqFD79QGd2TNP"

在上面的例子中,可以生成 100,000 个 ID,重复 risk 风险为万亿分之一。记住,所有 随机 ID 生成都具有 固有的重复风险。根本没有普遍唯一的 ID 这种东西,无论 UUID 的名称如何。与其盲目地使用一刀切(对于 UUID 来说,可以更好地描述为效率低下、一刀切不适用的解决方案),Puid 允许完全控制,以便可以根据具体应用需求显式声明风险。

对于那些明确知道 bits 位熵的情况

let token = try Puid(bits: 256, chars: .hexUpper)
try token.generate()
// => "3AE2F836FB09E4D32850ABBA3A20A510B8F47D5CB8EA7CF6BFF10DE58F8FA7BD"

目录

预定义字符

Puid.Chars 枚举 包含 17 个预定义字符集

名称 字符
.alpha ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
.alphaLower abcdefghijklmnopqrstuvwxyz
.alphaUpper ABCDEFGHIJKLMNOPQRSTUVWXYZ
.alphaNum ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
.alphaNumLower abcdefghijklmnopqrstuvwxyz0123456789
.alphaNumUpper ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
.base32 ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
.base32Hex 0123456789abcdefghijklmnopqrstuv
.base32HexUpper 0123456789ABCDEFGHIJKLMNOPQRSTUV
.crockford32 0123456789ABCDEFGHJKMNPQRSTVWXYZ
.decimal 0123456789
.hex 0123456789abcdef
.hexUpper 0123456789ABCDEF
.safeSscii !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~
.safe32 2346789bdfghjmnpqrtBDFGHJLMNPQRT
.safe64 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
.symbol !#$%&()*+,-./:;<=>?@[]^_{|}~

Puid.Chars.custom(String) 提供了一种机制,可以使用任何最多 256 个唯一字符的 String 进行 ID 生成。

目录

安装

Swift Package Manager URL: https://github.com/puid/Swift-puid

目录

许可证

MIT 许可证。参见 LICENSE