diff options
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 | [](https://godoc.org/github.com/rs/xid) [](https://raw.githubusercontent.com/rs/xid/master/LICENSE) [](https://travis-ci.org/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). | ||