Metadata-Version: 2.3
Name: fourword
Version: 1.0.1
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# FourWord

## 概要
新しいランダム識別子の生成方式です。

先頭にタイムスタンプがあり、テキスト化では文字セットとしてBase32 Hexを使用しているので、時系列順でのソートが可能です。
パディングには`=`の代わりに`Z`を使用しているため、英数字を使える場所であれば使用できるはずです。

できる限り衝突の可能性を低くしつつオーバーフローも防ぐために、タイムスタンプは固定にせず生成するビット数の1/4を占めるようにしています。
これによりビット数を多くするだけで、より長く継続して使用できます。
ただし代わりに、タイムスタンプ部分の先頭に無駄な連続した0の部分が発生します。

データベースなどで利用することを想定しています。

## 語源
Fourの部分は、タイムスタンプがビット数の1/4を占めることからです。
それをForwardと掛けています。

~~全体のビット数はね、うーん...これくらい。タイムスタンプが、4個分くらいかな~~

## Pythonライブラリ
```
from fourword.lib import FourWord

fourword = FourWord(bits=256)
print(fourword.text)
```

Pythonではfourwordライブラリを使用してFourWordを生成できます。
fourwordライブラリは外部ライブラリなしで動作します。

デフォルトのビット数は256です。

## CLIツール
AIに適当に作らせたCLIツールならあります。
あまりちゃんとテストしていませんが多分動きます。

ライブラリをそのままインストールすると`fourword-py`コマンドで使えるようになるはずです。

## 仕様
FourWordは次のようなバイト列で表現されます。

```
[ (全体のビット数/4) ビットのUNIXタイムスタンプ(UTC) ] + [ (全体のビット数/4*3) ビットのCSPRNG ]
```

例えば全体のビット数が256ビットの時、タイムスタンプは64ビット、ランダムな部分は192ビットになります。

全体のビット数は4で割れる、かつ4で割った商をさらに3で割れる必要があります。
つまり全体のビット数は32で割れる必要があります。

### テキスト化
テキスト化にはBase32 Hexのようなものを使用します。

前述した通り、パディング文字として`=`の代わりに`Z`を使用しますが、それ以外はBase32 Hexと同じです。

### オーバーフローの時期
各ビット数では、次の時期にオーバーフローします。

| ビット数 | タイムスタンプビット幅 | 最大秒数 | オーバーフロー時期（概算）|
|---:|---:|:---|:---|
| 256 | 64 bit | 約 1.84 × 10¹⁹ 秒 | 西暦約5844億年 (5.845 × 10¹¹ 年) |
| 512 | 128 bit | 約 3.40 × 10³⁸ 秒 | 約1.07 × 10³¹年後 |
| 768 | 192 bit | 約 6.28 × 10⁵⁷ 秒 | 約1.99 × 10⁵⁰年後 |
| 1024 | 256 bit | 約 1.16 × 10⁷⁷ 秒 | 約3.67 × 10⁶⁹年後 |
| 1280 | 320 bit | 約 2.14 × 10⁹⁶ 秒 | 約6.77 × 10⁸⁸年後 |
| 1536 | 384 bit | 約 3.94 × 10¹¹⁵ 秒 | 約1.25 × 10¹⁰⁸年後 |
| 1792 | 448 bit | 約 7.26 × 10¹³⁴ 秒 | 約2.30 × 10¹²⁷年後 |
| 2048 | 512 bit | 約 1.34 × 10¹⁵⁴ 秒 | 約4.24 × 10¹⁴⁶年後 |

## ライセンス
このリポジトリ内のソースコードやライブラリはMITライセンスの元で自由に使用できます。

FourWordの仕様そのものを利用するソフトウェアや、FourWordで生成したデータなどではクレジット表記は不要です。
