210 lines
9.7 KiB
Markdown
210 lines
9.7 KiB
Markdown
# go-xim
|
||
|
||
Package **xim** provides quazi‐ monotonically‐increasing unique‐identifiers.
|
||
|
||
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.
|
||
|
||
## See Also:
|
||
|
||
* https://github.com/reiver/xim-id
|