diff options
author | Rutger Broekhoff | 2023-12-29 21:31:53 +0100 |
---|---|---|
committer | Rutger Broekhoff | 2023-12-29 21:31:53 +0100 |
commit | 404aeae4545d2426c089a5f8d5e82dae56f5212b (patch) | |
tree | 2d84e00af272b39fc04f3795ae06bc48970e57b5 /vendor/github.com/rs/xid/README.md | |
parent | 209d8b0187ed025dec9ac149ebcced3462877bff (diff) | |
download | gitolfs3-404aeae4545d2426c089a5f8d5e82dae56f5212b.tar.gz gitolfs3-404aeae4545d2426c089a5f8d5e82dae56f5212b.zip |
Make Nix builds work
Diffstat (limited to 'vendor/github.com/rs/xid/README.md')
-rw-r--r-- | vendor/github.com/rs/xid/README.md | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/vendor/github.com/rs/xid/README.md b/vendor/github.com/rs/xid/README.md new file mode 100644 index 0000000..974e67d --- /dev/null +++ b/vendor/github.com/rs/xid/README.md | |||
@@ -0,0 +1,119 @@ | |||
1 | # Globally Unique ID Generator | ||
2 | |||
3 | [![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/xid) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/xid/master/LICENSE) [![Build Status](https://travis-ci.org/rs/xid.svg?branch=master)](https://travis-ci.org/rs/xid) [![Coverage](http://gocover.io/_badge/github.com/rs/xid)](http://gocover.io/github.com/rs/xid) | ||
4 | |||
5 | Package xid is a globally unique id generator library, ready to safely be used directly in your server code. | ||
6 | |||
7 | Xid uses the Mongo Object ID algorithm to generate globally unique ids with a different serialization (base64) to make it shorter when transported as a string: | ||
8 | https://docs.mongodb.org/manual/reference/object-id/ | ||
9 | |||
10 | - 4-byte value representing the seconds since the Unix epoch, | ||
11 | - 3-byte machine identifier, | ||
12 | - 2-byte process id, and | ||
13 | - 3-byte counter, starting with a random value. | ||
14 | |||
15 | The binary representation of the id is compatible with Mongo 12 bytes Object IDs. | ||
16 | The string representation is using base32 hex (w/o padding) for better space efficiency | ||
17 | when stored in that form (20 bytes). The hex variant of base32 is used to retain the | ||
18 | sortable property of the id. | ||
19 | |||
20 | Xid doesn't use base64 because case sensitivity and the 2 non alphanum chars may be an | ||
21 | issue when transported as a string between various systems. Base36 wasn't retained either | ||
22 | because 1/ it's not standard 2/ the resulting size is not predictable (not bit aligned) | ||
23 | and 3/ it would not remain sortable. To validate a base32 `xid`, expect a 20 chars long, | ||
24 | all lowercase sequence of `a` to `v` letters and `0` to `9` numbers (`[0-9a-v]{20}`). | ||
25 | |||
26 | UUIDs are 16 bytes (128 bits) and 36 chars as string representation. Twitter Snowflake | ||
27 | ids are 8 bytes (64 bits) but require machine/data-center configuration and/or central | ||
28 | generator servers. xid stands in between with 12 bytes (96 bits) and a more compact | ||
29 | URL-safe string representation (20 chars). No configuration or central generator server | ||
30 | is required so it can be used directly in server's code. | ||
31 | |||
32 | | Name | Binary Size | String Size | Features | ||
33 | |-------------|-------------|----------------|---------------- | ||
34 | | [UUID] | 16 bytes | 36 chars | configuration free, not sortable | ||
35 | | [shortuuid] | 16 bytes | 22 chars | configuration free, not sortable | ||
36 | | [Snowflake] | 8 bytes | up to 20 chars | needs machine/DC configuration, needs central server, sortable | ||
37 | | [MongoID] | 12 bytes | 24 chars | configuration free, sortable | ||
38 | | xid | 12 bytes | 20 chars | configuration free, sortable | ||
39 | |||
40 | [UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier | ||
41 | [shortuuid]: https://github.com/stochastic-technologies/shortuuid | ||
42 | [Snowflake]: https://blog.twitter.com/2010/announcing-snowflake | ||
43 | [MongoID]: https://docs.mongodb.org/manual/reference/object-id/ | ||
44 | |||
45 | Features: | ||
46 | |||
47 | - Size: 12 bytes (96 bits), smaller than UUID, larger than snowflake | ||
48 | - Base32 hex encoded by default (20 chars when transported as printable string, still sortable) | ||
49 | - Non configured, you don't need set a unique machine and/or data center id | ||
50 | - K-ordered | ||
51 | - Embedded time with 1 second precision | ||
52 | - Unicity guaranteed for 16,777,216 (24 bits) unique ids per second and per host/process | ||
53 | - Lock-free (i.e.: unlike UUIDv1 and v2) | ||
54 | |||
55 | Best used with [zerolog](https://github.com/rs/zerolog)'s | ||
56 | [RequestIDHandler](https://godoc.org/github.com/rs/zerolog/hlog#RequestIDHandler). | ||
57 | |||
58 | Notes: | ||
59 | |||
60 | - Xid is dependent on the system time, a monotonic counter and so is not cryptographically secure. If unpredictability of IDs is important, you should not use Xids. It is worth noting that most other UUID-like implementations are also not cryptographically secure. You should use libraries that rely on cryptographically secure sources (like /dev/urandom on unix, crypto/rand in golang), if you want a truly random ID generator. | ||
61 | |||
62 | References: | ||
63 | |||
64 | - http://www.slideshare.net/davegardnerisme/unique-id-generation-in-distributed-systems | ||
65 | - https://en.wikipedia.org/wiki/Universally_unique_identifier | ||
66 | - https://blog.twitter.com/2010/announcing-snowflake | ||
67 | - Python port by [Graham Abbott](https://github.com/graham): https://github.com/graham/python_xid | ||
68 | - Scala port by [Egor Kolotaev](https://github.com/kolotaev): https://github.com/kolotaev/ride | ||
69 | - Rust port by [Jérôme Renard](https://github.com/jeromer/): https://github.com/jeromer/libxid | ||
70 | - Ruby port by [Valar](https://github.com/valarpirai/): https://github.com/valarpirai/ruby_xid | ||
71 | - Java port by [0xShamil](https://github.com/0xShamil/): https://github.com/0xShamil/java-xid | ||
72 | - Dart port by [Peter Bwire](https://github.com/pitabwire): https://pub.dev/packages/xid | ||
73 | - PostgreSQL port by [Rasmus Holm](https://github.com/crholm): https://github.com/modfin/pg-xid | ||
74 | - Swift port by [Uditha Atukorala](https://github.com/uditha-atukorala): https://github.com/uditha-atukorala/swift-xid | ||
75 | - C++ port by [Uditha Atukorala](https://github.com/uditha-atukorala): https://github.com/uditha-atukorala/libxid | ||
76 | |||
77 | ## Install | ||
78 | |||
79 | go get github.com/rs/xid | ||
80 | |||
81 | ## Usage | ||
82 | |||
83 | ```go | ||
84 | guid := xid.New() | ||
85 | |||
86 | println(guid.String()) | ||
87 | // Output: 9m4e2mr0ui3e8a215n4g | ||
88 | ``` | ||
89 | |||
90 | Get `xid` embedded info: | ||
91 | |||
92 | ```go | ||
93 | guid.Machine() | ||
94 | guid.Pid() | ||
95 | guid.Time() | ||
96 | guid.Counter() | ||
97 | ``` | ||
98 | |||
99 | ## Benchmark | ||
100 | |||
101 | Benchmark against Go [Maxim Bublis](https://github.com/satori)'s [UUID](https://github.com/satori/go.uuid). | ||
102 | |||
103 | ``` | ||
104 | BenchmarkXID 20000000 91.1 ns/op 32 B/op 1 allocs/op | ||
105 | BenchmarkXID-2 20000000 55.9 ns/op 32 B/op 1 allocs/op | ||
106 | BenchmarkXID-4 50000000 32.3 ns/op 32 B/op 1 allocs/op | ||
107 | BenchmarkUUIDv1 10000000 204 ns/op 48 B/op 1 allocs/op | ||
108 | BenchmarkUUIDv1-2 10000000 160 ns/op 48 B/op 1 allocs/op | ||
109 | BenchmarkUUIDv1-4 10000000 195 ns/op 48 B/op 1 allocs/op | ||
110 | BenchmarkUUIDv4 1000000 1503 ns/op 64 B/op 2 allocs/op | ||
111 | BenchmarkUUIDv4-2 1000000 1427 ns/op 64 B/op 2 allocs/op | ||
112 | BenchmarkUUIDv4-4 1000000 1452 ns/op 64 B/op 2 allocs/op | ||
113 | ``` | ||
114 | |||
115 | Note: UUIDv1 requires a global lock, hence the performance degradation as we add more CPUs. | ||
116 | |||
117 | ## Licenses | ||
118 | |||
119 | All source code is licensed under the [MIT License](https://raw.github.com/rs/xid/master/LICENSE). | ||