initial commits
parent
1dff92d981
commit
b42905d454
185
README.md
185
README.md
|
@ -18,3 +18,188 @@ Here is an example of using `package iid`:
|
|||
```go
|
||||
var id iid.IID = iid.Generate()
|
||||
```
|
||||
|
||||
## Representation
|
||||
|
||||
Internally, the IID 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 `iid.IID.UnixTime()` method will give you that 39-bit _unix timestamp_.
|
||||
|
||||
And the `iid.IID.Chaos()` method will give you that 24-bit _chaos_.
|
||||
|
||||
(The _chaos_ is just a randomness that helps make these IIDs unique, when multiple IIDs 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.
|
||||
|
|
Loading…
Reference in New Issue