Notes on Sorted Data

2025/12/12 1:52

Notes on Sorted Data

RSS: https://news.ycombinator.com/rss

要約

日本語訳:


要約

バイト単位で値を比較するデータベースは、数値と論理順序を保持しつつコンパクトに保てるエンコーディング方式が必要です。
生のバイトは辞書式に比較されますが、固定幅整数は小さな数ではスペースを無駄にし、ビット順序(エンディアン)問題を起こす可能性があります。可変長整数(例:protobuf)のような連続ビット付きエンコーディングは順序を破壊します。長さプレフィックス方式では、最初に必要最低バイト数を保存し、その後でビッグエンディアン形式の数値を格納することで順序が回復されます。コンパクトな4‑bit プレフィックスは最大15 バイト(124 ビット)まで符号化でき、より大きい値には追加バイトが付加されます。符号付き整数は比較前に再マッピングする必要があります;最小値 (

num ^ MIN
) で XOR を行うと二の補数表現でも正しく順序づけられます。一方 IEEE‑754 浮動小数点数には同様のトリックが必要です。正の値は
num ^ MIN
、負の値はまず
MIN
にシフトし、その後 XOR します。

任意データに対して長さプレフィックスを使用すると自然な辞書式順序が逆転することがあります(例:

"abcd"
"4abcd"
vs.
"def"
"3def"
)。ヌル終端子 (
0x00
) を用いると、常に他の任意バイトより小さいため順序を保持できます。タプル要素間にこのような terminator を挿入すると、シリアライズされた構造体の正しい辞書式比較が保証されます。長さプレフィックスはスキャン時の高速スキップも可能ですが、自然順序は保てません。人間可読の区切り文字(例:
"/"
"."
)は便利ですが必ずしも安定した順序を提供するわけではありません。

この記事は読者に追加パターンや修正点を共有してほしいと呼びかけており、さまざまなデータ型や複合構造に対するエンコーディング戦略の継続的改善努力を強調しています。

本文

ストレージシステムでのデータ順序付け

ソート済み状態でデータを格納・比較する必要がある場合、
そのデータの表現方法は極めて重要です。

以下では、順序付きバイト文字列を扱う際に頻繁に発生するパターン(および落とし穴)を整理しています。


1. バイト

  • 生のバイトはリテクソグラフィック(「byte‑lexicographical」)で比較されます。
  • 多くのデータベース、キー・バリュー ストア、およびその他のシステムではこの比較器が採用されています。

2. 整数

固定幅整数

  • 保存は簡単ですが、小さな数値に対してはスペースを浪費します。
  • エンディアン の問題:
    • ビッグ‑エンディアン(ネットワーク順):
      0x12 0x34 0x56 0x78
    • リトル‑エンディアン(x86/ARM):
      0x78 0x56 0x34 0x12

リトル‑エンディアンのバイトを逐次比較しても、数値順序は保たれません。

可変長整数(varint)

典型的な protobuf スタイル varint:

value | encoded | first byte
------------------------------------
0x10000000 | 0b1_0001_000... | 0x80
...
  • 最上位ビットは継続フラグです。
  • しかし最初のバイトは大きさを反映しないため、順序が崩れます。

長さプレフィックス付き(順序付 varint)

number : 0x0B_B8   (3000)
bytes  : 2
encoded: [0x02, 0x0B, 0xB8]
  • 最小バイト数をプレフィックスに格納。
  • 残りのバイトはビッグ‑エンディアンで保存。
  • 長さが短いほど数値が小さいため、順序が保たれます。

コンパクト 4‑bit 長さプレフィックス

  1. 必要最小バイト数を算出し、4ビット減算。
  2. 最初のバイトにそのカウント(4ビット)と数値の上位4ビットを格納。
  3. 残りのビットは次のバイトへ。

例:

number : 0x0B_B8   (3000)
bytes  : 2 → 減算1 => 1
first byte: 0x1 << 4 | 0xB = 0x1B
encoded : [0x1B, 0xB8]
  • 最大で約124‑ビット数をサポート。
  • プレフィックスが
    1111
    の場合、最後のバイトのみ継続ビットを使用し、128‑ビット全体に対応。

3. 有符号(負)整数

  • 2’s コンプリメントでは最上位ビットが符号として使われます。
  • 単純なバイト比較だと
    -1
    (0xFF) が
    0
    より大きく扱われてしまいます。

再マッピング戦略

remapped = original ^ MIN_VALUE   // 最小 signed 値で XOR
  • これにより、全符号付き範囲が unsigned 範囲へ写像され、順序を保ったまま比較できます。

4. 小数と浮動小数点

IEEE‑754 は符号ビットを最上位に置くため、負の数は正の数よりも大きく見えます(バイト単位で比較した場合)。

ルール

  1. 正の浮動小数点
    num ^ MIN
    (有符号整数と同様)。
  2. 負の浮動小数点: 逆順にするため
    num - MIN
    を行い、次に XOR で正規化。

5. 任意データ(文字列・バイト)

  • 長さプレフィックスは「長さビットが比較対象になる」問題があります。
"abcd" → [0x04, 'a', 'b', 'c', 'd']
"def"  → [0x03, 'd', 'e', 'f']   // 0x04 > 0x03 ⇒ 誤順
  • 終端バイト(例:
    0x00
    )を用いてデータを区切ります。
    • NULL 終端は他の任意バイトより小さいため、自然な順序が保たれます。
    • 注意点:データ中に terminator が現れる場合はエスケープが必要です。

6. 複合データ(タプル・構造体)

例:

("12", "34")   → [0x31, 0x32, 0x33, 0x34]
("123", "4")   → [0x31, 0x32, 0x33, 0x34]
  • 両方とも同一のシリアライズを持ち、順序が失われます。
  • 要素間に NULL 終端を挿入することで、要素ごとの順序を保証します。
[0x31, 0x32, 0x00, 0x33, 0x34]   // ("12", "34")
[0x31, 0x32, 0x33, 0x00, 0x34]   // ("123", "4")

要約

データ型順序付け戦略主な注意点
バイト生のリテクソグラフィック単純だがバイト文字列限定
固定幅整数ビッグ‑エンディアンエンディアンに注意
可変長整数(protobuf)なし(順序破綻)継続フラグで順序崩壊
長さプレフィックス付き整数プレフィックス + ビッグ‑エンディアン順序保持、余分バイト必要
コンパクト4‑bitプレフィックスプレフィックス+ビット分割スペース節約、範囲制限
有符号整数XOR with MIN符号付きを unsigned へマッピング
浮動小数点符号ビット処理 + XOR負の値は逆順に変換
文字列/バイトNULL 終端terminator がデータ中に現れないよう注意
タプル/構造体NULL 終端でフィールド区切り要素ごとの正確な順序を保証

必要に応じて、他のパターンや修正点があればぜひ追加してください!

同じ日のほかのニュース

一覧に戻る →

2025/12/18 1:42

Gemini 3 Flash: Frontier intelligence built for speed

## Japanese Translation: > **概要:** > Google は、低コストで高速な AI モデル Gemini 3 Flash をリリースしました。これは Flash レベルのレイテンシーでプロ級の推論性能を提供します。Gemini アプリと Search の AI Mode では既にデフォルトエンジンとなり、Gemini 2.5 Flash は世界中で追加料金なしで即座に置き換えられます(Gemini 3 Pro が公開された直後)。ベンチマーク結果では、GPQA Diamond で 90.4 %、Humanity’s Last Exam(ツール無し)で 33.7 %、MMMU Pro で 81.2 %、SWE‑bench Verified で 78 % を獲得し、より大きなフロンティアモデルを上回ります。Gemini 3 Flash は Gemini 2.5 Pro より約30 %少ないトークン数で同等以上の性能を発揮します。価格は入力トークンあたり 0.50 USD、出力トークンあたり 3 USD(音声入力は 1 USD/百万トークン)です。JetBrains、Bridgewater Associates、Figma など多くの企業がこのモデルを活用し、コーディング、データ分析、設計ワークフローの高速化に役立てています。開発者は Gemini API(Google AI Studio)、Antigravity、Gemini CLI、Android Studio、Vertex AI、および Gemini Enterprise を通じて Gemini 3 Flash にアクセスできます。このモデルは Gemini アプリと Search 経由で全ユーザーへ展開されるほか、プレビュー API でも利用可能です。

2025/12/18 6:13

I got hacked: My Hetzner server started mining Monero

## Japanese Translation: ヘツナー VPS 上で Coolify をホストし、Next.js ベースの Umami アナリティクスを含む複数コンテナを実行していた。12 月 7 日に、Umami コンテナ内に Monero マイニングボット(`javae`/`xmrig`)が出現し、CPU スパイクが約 15 倍に増大した。著者はマイナーをコンテナに追跡し、CVE‑2025‑66478 ― Next.js の React Server Components “Flight” プロトコルにおける不安全なデシリアライゼーション(Puppeteer を介さずリモートコード実行が可能)を特定した。HTTP リクエストを巧妙に作成することで RCE が発動し、マイナーがインストールされた。ホストファイルシステムのチェック(`/tmp/.XIN-unix/javae`)ではエスケープは確認できず、コンテナは非 root の `nextjs` ユーザーとして実行され、特権モードやボリュームマウントも無いため、すべての悪意あるプロセスは名前空間内に留まった。 著者は侵害されたコンテナを停止・削除し、CPU 負荷を通常状態へ戻した。UFW をデフォルトで受信トラフィックを拒否するよう設定し、SSH、HTTP、および HTTPS のみ許可することで、オープンな PostgreSQL / RabbitMQ ポートを効果的に遮断した。ヘツナーは 2025‑12‑17 にネットワークスキャン検知後、アブズケース警告を送付し、著者が侵害と対策を説明するとともにチケットはクローズされた。 重要な教訓として、十分に隔離されているコンテナでも基盤フレームワークに脆弱性がある場合は突破可能であり、「Next.js を使っていない」状態が第三者ツールの依存関係によって偽りになるケースがあることを指摘した。この事例は、ファイアウォールルール、非 root ユーザー設定、特権モード無し、監視・ fail2ban の導入、およびタイムリーなパッチ適用という防御層の重要性を強調した。 ## 行動計画 - Umami を廃止する - すべてのコンテナに対してユーザー権限とマウントを監査する - SSH アクセスを強化し、アラートを設定する - セキュリティパッチを定期的に適用し、将来のインシデントを防止する ---

2025/12/18 3:15

How SQLite is tested

## Japanese Translation: > **SQLiteのテストインフラは網羅的で、コードベース全体にわたって完全な分岐カバレッジを実現しています。** > プロジェクトには約155.8 KSLOCのCソースがありますが、テストコードは92 M KSLOC以上――約590倍の量――で、すべての行が実行されることを保証しています。4つの独立したハーネスがカバレッジを提供します: > • **TCL**(27.2 KSLOC、1,390個のスクリプトファイル)で51,445件の異なるケースと数百万回の実行があります; > • **TH3**(1,055.4 KSLOC、約76.9 MBのバイナリ)で50,362件の異なるケース、完全カバレッジに必要な2.4 Mインスタンス、および約248.5 Mテストを実行するソークテストがあります; > • **SQL Logic Test (SLT)** はSQLiteとPostgreSQL、MySQL、MS SQL Server、Oracle 10gを比較し、7.2 Mクエリと1.12 GBのデータで検証します; > • **dbsqlfuzz**(libFuzzerベース)はSQLとデータベースファイルの両方を変異させ、約336個のシードファイルから16コアで1日あたり約500 Mテストを提供します。 > 追加の軽量ハーネスには `speedtest1.c`、`mptester.c`、`threadtest3.c`、`fuzzershell.c`、およびJSONBファズラ `jfuzz` が含まれます。 > 異常テストではメモリ不足、I/O障害、クラッシュ/電源損失、およびカスタムmalloc/VFSフックを使用した複合故障をシミュレートし、各障害後に整合性チェックが実行されます。 > ファズリングの歴史はAFL(2014‑2019)からOSS Fuzz(2016年以降)、その後dbsqlfuzz(2018年末)とjfuzz(2024年1月)へ進化しました。`fuzzcheck` スクリプトは毎回ビルド時に興味深いケースを再実行し、新しいバグが自動的にリグレッションテストとして生成されることを保証します。 > リソースリーク検出はTCL/TH3ハーネスに組み込まれており、メモリリーク、ファイルディスクリプタ枯渇、および不要なスレッドが自動的に監視されます。 > カバレッジは `gcov` を使用して100 %の分岐カバレッジと変異テストで達成され、マクロ(`ALWAYS`、`NEVER`、`testcase`)がMC/DCを強制し、コメント(`/*OPTIMIZATION‑IF‑TRUE/FALSE*/`)は偽陽性を防ぎます。 > 結果として、継続的に拡張される高い信頼性のテストスイートが実現し、ユーザーにSQLiteの安定性への確信を提供し、セキュリティ脆弱性から保護し、オープンソースデータベース品質保証のベンチマークとなります。

Notes on Sorted Data | そっか~ニュース