1. 空配列 -> 0
  2. [0] -> 0
  3. [1,2,3] -> 6
  4. [100,100,100] -> 44
  5. [255,1] -> 0
  6. [255,255,255,255] -> 252
  7. [10,20,30,40,50] -> 150
  8. [128,128] -> 0
コース一覧
コンピューターサイエンス入門:理論編
単純チェックサム

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

単純チェックサム

ケーブルの上を流れている途中で 1 ビットが反転しても、受け取った側には普通のデータに見えます。壊れたことに気づく仕組みが要ります。いちばん軽いのが、全部足して 1 バイトに丸めた値を、一緒に送る方法です。

化けても、見た目では分からない

送る側が中身から短い値を計算して末尾に付け、受け取る側が同じ計算をして見比べます。値が違えば、途中で何かが変わったと分かります。あとは送り直してもらえば済みます。この短い値がチェックサムです。

プレーンテキスト

送る側 本文 と 検査値 を並べて送る 受け取る側 本文から検査値を作り直して見比べる 違った -> 送り直してもらう 同じ -> 先へ進む

計算は 1 回の走査で終わるので、小さな機器の側で作るのも簡単です。シリアル通信や、バーコードの末尾に付いている検査桁など、細い経路では今も広く使われています。

ファイルをダウンロードしたあとに SHA-256 の値を照らし合わせる、あの作業と目的は同じです。違うのは強さで、こちらは 1 バイトしか使わないぶん、見逃す壊れ方がずっと多くなります。

足して、1 バイトに丸める

全部のバイトを足すだけだと、データが長くなるにつれて値が際限なく大きくなります。1 バイトに収めたいので、256 で割った余りを取ります。余りを取る計算は、あふれたぶんを巻き戻す動きをします。

Python

today = 3 # 水曜を 3 とする print((today + 10) % 7) # 6

10 日後の曜日を出す計算と同じです。7 を超えたぶんは 1 週間ぶん巻き戻って、必ず 0 から 6 に収まります。256 で割れば、必ず 0 から 255 に収まります。

足し合わせる側は、合計を入れる変数を 0 から始めて 1 つずつ足していきます。中身が空のときは 0 のまま返ることになります。空の入力で落ちないのは、初期値を 0 にしておく利点です。

受け取る値の範囲にも気をつけます。1 バイトとして扱うなら、中身は 0 から 255 のはずです。ここに負の数や 256 以上が混ざると、余りの結果が想定から外れます。とくに、割られる数が負になったときの余りの符号は言語ごとに違います。

同じ値になる壊れ方がある

ここが一番大事なところです。チェックサムが一致しても、壊れていないことの証明にはなりません。値が一致したまま中身が変わる壊れ方が、実際に存在するからです。

  • 並び順が入れ替わっただけなら、和は変わりません
  • どこかが 5 増え、別のどこかが 5 減れば、和は元のままです
  • ちょうど 256 ぶんずれた変化は、余りを取った時点で消えます

プレーンテキスト

[10, 60] -> 70 [60, 10] -> 70 並びが違っても同じ値 [15, 55] -> 70 中身が違っても同じ値

つまりこの計算で分かるのは、違うということだけです。同じであることは分かりません。並び順まで見たいなら Fletcher や Adler-32、通信路が荒れる場所なら CRC-32、誰かが意図して書き換える可能性があるなら SHA-256 のような暗号学的ハッシュを使います。

送る側と受け取る側で同じ計算をする、という約束が前提なので、桁の扱いや順番の決め方が食い違うと、壊れていないのに一致しないという逆の事故も起きます。

単純な和は、軽さと引き換えに見逃しを受け入れた仕組みです。どこまで見逃すのかを知ったうえで選ぶなら、いまでも十分使えます。

要件

  1. 全バイトを合計する
  2. 合計を 256 で割った余りを返す
  3. 空配列のときは 0 を返す

入出力例

checksumSum([]) → 0 checksumSum([0]) → 0 checksumSum([1,2,3]) → 6 checksumSum([100,100,100]) → 44 checksumSum([255,1]) → 0 checksumSum([255,255,255,255]) → 252 checksumSum([10,20,30,40,50]) → 150 checksumSum([128,128]) → 0

ヒント

Python なら sum(bytes_list) % 256 で 1 行

JavaScript の reduce を使うと bytes.reduce((a, b) => a + b, 0) % 256

値を 0〜255 に収めるには % 256 を忘れない

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 第6章まとめクイズ

    ネットワークと符号化 (Base64 / URL エンコード / IPv4 / CIDR / チェックサム) の理解度を確認するクイズです。

  • 重複データを 1NF に変換 (フラットなリスト化)

    1 セルに複数値が詰め込まれた CSV 風データを、1 行 = 1 値にフラット化する第一正規形(1NF)の変換を実装します。

  • CIDR プレフィックスからネットマスクを作る

    /24 のような CIDR プレフィックスから、対応する 32bit のネットマスク (上位 prefix bit が 1) を返します。

  • 32bit 整数を IPv4 アドレスに変換

    32bit の整数を 192.168.1.1 のような IPv4 文字列に戻す関数を実装します。前レッスンの逆操作です。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ビット2進数の1桁。0 か 1 のどちらか
  • 変数データに名前をつけて参照する仕組み
  • 配列サイズ固定の同型データの集まり
main.py
学習モード
エディタを読み込んでいます

メモ

単純チェックサム

⌘S で保存