简单、快速、灵活和高效地生成大概唯一的标识符 (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。