UID の生成に関するさまざまな質問をいくつか見つけましたが、私が知る限り、ここでの要件はやや独特です (ha)。
要約すると、「ローカル」で一意の非常に短い ID を生成する必要がありますが、「グローバル」または「ユニバーサル」で一意である必要はありません。制約は単に美的またはスペースの問題に基づいているのではなく、これが本質的にハードウェア タグとして使用されており、ハードウェアの制約の対象であるという事実によるものです。仕様は次のとおりです。
ハード要件
- ID には 10 進数のみを含める必要があります (基になるデータは BCD です)。
- ID の最大長は 12 文字 (数字) です。
- オフラインで生成する必要があります - データベース/Web 接続が常に利用できるとは限りません!
ソフト要件
- 暦年および/または月から開始したいと考えています。これは多くのエントロピーを浪費するので、これについて妥協したり、完全に廃棄したりすることは気にしません (必要な場合)。
- 特定のマシンから生成された ID は連続して表示されます。
- ID はマシンごとに並べ替える必要はありません。たとえば、マシン 1 が [123000、124000、125000] を吐き出し、マシン 2 が [123500、123600、124100] を吐き出してもまったく問題ありません。
- ただし、集合的な意味でシーケンシャルに見えるほど優れています。[200912000001, 200912000002, 200912000003, ...] のような ID のセットは完璧ですが、これは明らかに複数のマシン間で拡張できません。
使用シナリオ:
- このスキームの範囲内の ID は、10 台、多くても 100 台の異なるマシンから生成されます。
- 生成される ID は合計で数百万を超えることはありません。
- 同時実行性は非常に低いです。1 台のマシンが ID を生成する頻度は、5 分ごとほどではありません。また、ほとんどの場合、一度に 5 台以下のマシンが同じ時間または同じ日に ID を生成します。特定のマシンで 1 日以内に生成される ID は 100 未満であり、すべてのマシンで 500 未満であると予想しています。
- 少数のマシン (3 ~ 5) が、ID の 80% 以上を生成する原因となる可能性が最も高いでしょう。
12 桁未満の 10 進数を使用して 100 ミリ秒または 10 ミリ秒の精度までタイムスタンプをエンコードできることを私は知っています。私が SO でこれを尋ねている理由は、人間が読める年/月をそこに組み込むか、ソース マシンに関する情報の一部をエンコードするか、またはその両方を行いたいからです。
誰かがこれらのソフト要件の妥協を手伝ってくれることを望んでいます...または、他の要件を考慮してそれらのどれも不可能な理由を説明してください。
(PS 私の「ネイティブ」言語は C# ですが、素晴らしいアイデアがあれば、どの言語のコードでも擬似コードでも問題ありません。)
アップデート:
これで寝る機会ができたので、実際にやろうとしていることは、デフォルトでタイムスタンプエンコーディングを使用し、個々のインストールが独自の 2 または3 桁のマシン ID。そうすれば、ID をいじり、人間が読み取れる情報を詰め込みたい顧客は、一意性を保証する独自の方法を整理することができ、誤用については責任を負いません。たまたますべてのオンライン インストールを行っている場合は、マシン ID を処理するためのサーバー ユーティリティを提供することで、私たちが支援するかもしれません。