UUID以前开发时用得多了,它很好用,不过,现在有个强力的挑战者:Nanoid。
Nanoid已经可以在多种语言
C#, C++, Clojure and ClojureScript, Crystal, Dart & Flutter, Deno, Go, Elixir, Haskell, Janet, Java, Nim, Perl, PHP, Python with dictionaries, Ruby , Rust, Swift
里使用,下面例子以c#代码编写。
一 安装
Install-Package Nanoid
二 默认使用
for (var i = 0; i < 1000; i++) { Console.WriteLine(Nanoid.Generate()); }
生成的结果类似:
FP3q9j_Fp3SiuO8pVTFOC
Mik9f08ZW5GFqcmxcTXP7
SJX7-h5TlLVmuRhAiUzyh
uhwA42IJUtB3z2yOc5PRz
tYBoKqEYRFbzpfoSLq2op
Vih8kh3cIlvzIj-sao8zq
1 默认是以字符集 "
_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 生成的21长度的随机字符串
2 默认的随机产生器不是 System.Random ,而是
System.Security.Cryptography.RandomNumberGenerator ,这个产生器比 System.Random 更安全,更随机。但我们也可以继续使用 System.Random:
var myRandom = new Random(100); for (var i = 0; i < 1000; i++) { Console.WriteLine(Nanoid.Generate(myRandom)); }
3 可以自定义输出结果的长度:
var size = 10; for (var i = 0; i < 1000; i++) { Console.WriteLine(Nanoid.Generate(size:size)); }
结果类似:
mDazc4R0v5
RjXWpmjil4
8gP9GS1UWD
mr6gHkYWfw
8vfT_q0YQe
wr9Ib_85u1
UxvufAFutf
ckm0ahMxI8
4 可以自定义字符集:
var myChars="ABCD1234"; for (var i = 0; i < 1000; i++) { Console.WriteLine(Nanoid.Generate(myChars)); }
结果类似:
BB1D4B131342B34C3CA2D
24D2B12BA34BDCABC3AB3
C2AD1DC1C43BABBACB443
D3B2411AD1AD2BDD1A1AB
DCDB2432CCADD2AB2DDCB
1CA433DDDDCB22A11B3B1
13232D34D4B14DAA2AD4C
三 Nano的优点和缺点
- 快速。javascript的版本据说比 uuid 快 60%
- 紧凑。Nanoid 21字符,UUID 32字符。
- 自定义字符。
- 没有第三方依赖。
- URL友好。
- 更安全。不再使用系统的System.Random(JS:Math.random)
- 缺点还是一样:不是顺序的,作为数据库列时做索引有不利影响。