go-xim/README.md

206 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# go-xim
Package **xim** provides quazi monotonicallyincreasing uniqueidentifiers.
The serialized form of the **xim-id** is safe to use as a _file_ or _directory_ name.
## Documention
Online documentation, which includes examples, can be found at: http://godoc.org/github.com/reiver/go-xim
[![GoDoc](https://godoc.org/github.com/reiver/go-xim?status.svg)](https://godoc.org/github.com/reiver/go-xim)
## Example
Here is an example of using `package xim`:
```go
var id xim.ID = xim.Generate()
```
## Representation
Internally, the xim-id is compactly stored in an `uint64`. The anatomy of this is as follows:
```
unix timestamp (39-bits)
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
0b0000000001100001100001110110100111011001110000111111000101100100
▲ ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
always zero (1-bit) chaos (20-bits)
```
The `xim.ID.UnixTime()` method will give you that 39-bit _unix timestamp_.
And the `xim.ID.Chaos()` method will give you that 24-bit _chaos_.
(The _chaos_ is just a randomness that helps make these xim-ids unique, when multiple xim-ids are being produced simultaneously.)
## Temporal Ordering of Representation
On thing to note that is, because this puts the _unix timestamp_ at the most-significant-bits, that the numerical-ordering of this `uint64` will almost always be the same as temporal-ordering.
This was done intentionally.
## Serialization
This is serialized using what this package calls **xim** notation.
An example of **xim** notation looks like this:
```
xi-556PVvNyq3m
```
The anatomy of the **xim** string is as follows:
```
a special base64 encoding
▼▼▼▼▼▼▼▼▼▼▼
xi-556PVvNyq3m
▲▲ ▲
prefix suffix
```
So every **xim** string starts with the characters `xi`, and ends with the character `m`.
And then what is in the middle of those is a special base64 encoding of the `uint64` mentioned before.
What is special about the base64 encoding is that it doesn't use the usual ordering of the symbols.
This special base64 encoding uses:
```
┌───────┬────────┬──────┐
│ Index │ Binary │ Char │
├───────┼────────┼──────┤
│ 0 │ 000000 │ - │
├───────┼────────┼──────┤
│ 1 │ 000001 │ 0 │
├───────┼────────┼──────┤
│ 2 │ 000010 │ 1 │
├───────┼────────┼──────┤
│ 3 │ 000011 │ 2 │
├───────┼────────┼──────┤
│ 4 │ 000100 │ 3 │
├───────┼────────┼──────┤
│ 5 │ 000101 │ 4 │
├───────┼────────┼──────┤
│ 6 │ 000110 │ 5 │
├───────┼────────┼──────┤
│ 7 │ 000111 │ 6 │
├───────┼────────┼──────┤
│ 8 │ 001000 │ 7 │
├───────┼────────┼──────┤
│ 9 │ 001001 │ 8 │
├───────┼────────┼──────┤
│ 10 │ 001010 │ 9 │
├───────┼────────┼──────┤
│ 11 │ 001011 │ A │
├───────┼────────┼──────┤
│ 12 │ 001100 │ B │
├───────┼────────┼──────┤
│ 13 │ 001101 │ C │
├───────┼────────┼──────┤
│ 14 │ 001110 │ D │
├───────┼────────┼──────┤
│ 15 │ 001111 │ E │
├───────┼────────┼──────┤
│ 16 │ 010000 │ F │
├───────┼────────┼──────┤
│ 17 │ 010001 │ G │
├───────┼────────┼──────┤
│ 18 │ 010010 │ H │
├───────┼────────┼──────┤
│ 19 │ 010011 │ I │
├───────┼────────┼──────┤
│ 20 │ 010100 │ J │
├───────┼────────┼──────┤
│ 21 │ 010101 │ K │
├───────┼────────┼──────┤
│ 22 │ 010110 │ L │
├───────┼────────┼──────┤
│ 23 │ 010111 │ M │
├───────┼────────┼──────┤
│ 24 │ 011000 │ N │
├───────┼────────┼──────┤
│ 25 │ 011001 │ O │
├───────┼────────┼──────┤
│ 26 │ 011010 │ P │
├───────┼────────┼──────┤
│ 27 │ 011011 │ Q │
├───────┼────────┼──────┤
│ 28 │ 011100 │ R │
├───────┼────────┼──────┤
│ 29 │ 011101 │ S │
├───────┼────────┼──────┤
│ 30 │ 011110 │ T │
├───────┼────────┼──────┤
│ 31 │ 011111 │ U │
├───────┼────────┼──────┤
│ 32 │ 100000 │ V │
├───────┼────────┼──────┤
│ 33 │ 100001 │ W │
├───────┼────────┼──────┤
│ 34 │ 100010 │ X │
├───────┼────────┼──────┤
│ 35 │ 100011 │ Y │
├───────┼────────┼──────┤
│ 36 │ 100100 │ Z │
├───────┼────────┼──────┤
│ 37 │ 100101 │ _ │
├───────┼────────┼──────┤
│ 38 │ 100110 │ a │
├───────┼────────┼──────┤
│ 39 │ 100111 │ b │
├───────┼────────┼──────┤
│ 40 │ 101000 │ c │
├───────┼────────┼──────┤
│ 41 │ 101001 │ d │
├───────┼────────┼──────┤
│ 42 │ 101010 │ e │
├───────┼────────┼──────┤
│ 43 │ 101011 │ f │
├───────┼────────┼──────┤
│ 44 │ 101100 │ g │
├───────┼────────┼──────┤
│ 45 │ 101101 │ h │
├───────┼────────┼──────┤
│ 46 │ 101110 │ i │
├───────┼────────┼──────┤
│ 47 │ 101111 │ j │
├───────┼────────┼──────┤
│ 48 │ 110000 │ k │
├───────┼────────┼──────┤
│ 49 │ 110001 │ l │
├───────┼────────┼──────┤
│ 50 │ 110010 │ m │
├───────┼────────┼──────┤
│ 51 │ 110011 │ n │
├───────┼────────┼──────┤
│ 52 │ 110100 │ o │
├───────┼────────┼──────┤
│ 53 │ 110101 │ p │
├───────┼────────┼──────┤
│ 54 │ 110110 │ q │
├───────┼────────┼──────┤
│ 55 │ 110111 │ r │
├───────┼────────┼──────┤
│ 56 │ 111000 │ s │
├───────┼────────┼──────┤
│ 57 │ 111001 │ t │
├───────┼────────┼──────┤
│ 58 │ 111010 │ u │
├───────┼────────┼──────┤
│ 59 │ 111011 │ v │
├───────┼────────┼──────┤
│ 60 │ 111100 │ w │
├───────┼────────┼──────┤
│ 61 │ 111101 │ x │
├───────┼────────┼──────┤
│ 62 │ 111110 │ y │
├───────┼────────┼──────┤
│ 63 │ 111111 │ z │
└───────┴────────┴──────┘
```
The advantage of this is that lexical-ordering (in Unicode & ASCII) is also symbol-ordering.
One design goal is that lexical ordering of the **xim** strings is (almost always) also temporal ordering of the **xim** strings.
Another design goal of it is that these **xim** strings should be able to be used as a file-name, or a directory-name.