XORパリティのテスト

RAID5方法によるファイルのパリティ - Ko-Taのバ・ー・ルのようなもの

を読んでへぇと思ったので書いてみたコード

#include <random>
#include <algorithm>
#include <memory>
#include <cassert>

//
// XOR パリティのテスト
//
void parityTest()
{
  std::random_device seedGenerator;
  auto seed = seedGenerator();
  std::default_random_engine randomEngine(seed);
  std::uniform_int_distribution<> dist(0, UINT8_MAX);
  for (int i = 3; i < 256; i++)
  {
    // + 1 はパリティ保持用
    std::unique_ptr<uint8_t> buffer(new uint8_t[[i + 1]]);
    uint8_t *buf = buffer.get();

    // bufにランダムなデータを詰める
    std::generate(buf, buf + i, std::bind(dist, randomEngine));

    // bufの最後のインデックスにパリティを保持
    int parity = 0;
    for (int x = 0; x < i; x++) parity ^= buf[x];
    buf[[i]] = parity;

    // bufのデータのうちどれか1つが壊れたと仮定してパリティによる値の復元をテスト
    for (int target = 0; target < i + 1; target++)
    {
      // ターゲット以外のインデックスのデータを全てXORするとターゲットと同じ値になる
      // ※targetに0を設定しておけばtargetもXORに混ぜてOK
      int recoveredData = 0;
      uint16_t actual = buf[target];
      buf[target] = 0;
      for (int n = 0; n < i + 1; n++)
      {
        recoveredData ^= buf[n];
      }
      assert(recoveredData == actual);
      buf[target] = actual; // 次のテストの為に戻す
    }
  }
}
Share