System.Security.Cryptography.MD5クラスでMD5ハッシュ値の計算、Convert.ToBase64StringメソッドでBASE64への変換ができる。

§1 MD5ハッシュ値の生成

using System;
using System.Security.Cryptography;
using System.Text;

class Sample {
  static void Main()
  {
    var source = "hogehoge";

    using (var md5 = MD5.Create()) {
      // MD5ハッシュ値を求める
      var md5hash = md5.ComputeHash(Encoding.UTF8.GetBytes(source));
      // もとめたハッシュ値をBASE64に変換する
      var md5hash_base64 = Convert.ToBase64String(md5hash);

      // 出力結果: MpQ15eZr6AmmVq8QX0JAHg==
      Console.WriteLine(md5hash_base64);
    }
  }
}

CompluteHashメソッドにはStreamクラスを渡すこともできるので、ファイルのハッシュ値を求めたい場合などはファイルを開いてStreamを渡せばよい。

using System;
using System.IO;
using System.Security.Cryptography;

class Sample {
  static void Main()
  {
    using (var sourceStream = File.OpenRead("file.dat")) {
      using (var md5 = MD5.Create()) {
        // MD5ハッシュ値を求める
        var md5hash = md5.ComputeHash(sourceStream);
        // もとめたハッシュ値をBASE64に変換する
        var md5hash_base64 = Convert.ToBase64String(md5hash);

        Console.WriteLine(md5hash_base64);
      }
    }
  }
}

SHA256クラスなどHashAlgorithmの派生クラスを用いることで、上記と同様のコードでMD5以外のハッシュ値を求めるようにすることもできる。

using System;
using System.Security.Cryptography;
using System.Text;

class Sample {
  static void Main()
  {
    var source = "hogehoge";

    using (var sha256 = SHA256.Create()) {
      // SHA256ハッシュ値を求める
      var sha256hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(source));
      // もとめたハッシュ値をBASE64に変換する
      var sha256hash_base64 = Convert.ToBase64String(sha256hash);

      // 出力結果: THFtTPIRx7fS8yM8lBdxrQUH6lus+TtJJ2aqQa6fcg0=
      Console.WriteLine(sha256hash_base64);
    }
  }
}

md5sumコマンドのようにBASE64ではなく16進値で取得したい場合は、Convert.ToBase64String()メソッドの代わりにBitConverter.ToString()メソッドを使う。 ただし、BitConverter.ToString()メソッドはバイト毎にハイフンを挟み、大文字形式で文字列化するので、md5sumコマンドの結果と同じにしたい場合はハイフンを取り除き、大文字を小文字に必要がある。

using System;
using System.Security.Cryptography;
using System.Text;

class Sample {
  static void Main()
  {
    var source = "hogehoge";

    using (var md5 = MD5.Create()) {
      // MD5ハッシュ値を求める
      var md5hash = md5.ComputeHash(Encoding.UTF8.GetBytes(source));
      // もとめたハッシュ値を16進形式に変換したあと、ハイフンを取り除き、小文字にする
      var md5sum = BitConverter.ToString(md5hash).Replace("-", string.Empty).ToLowerInvariant();

      // 出力結果: 329435e5e66be809a656af105f42401e
      Console.WriteLine(md5sum);
    }
  }
}

参考までに、md5sumコマンドを使った場合の結果は以下のとおり。

md5sumコマンドでの結果
$ echo -n "hogehoge" | md5sum -
329435e5e66be809a656af105f42401e  -

§2 MD5クラスを使ってmd5sumコマンドを実装する

MD5クラスを使ってmd5sumコマンドと同じ結果を出力するプログラムを作る。

md5sum.cs (md5sumコマンドと同じ結果を出力するプログラム)
using System;
using System.IO;
using System.Security.Cryptography;

class MD5Sum {
  static void Main(string[] args)
  {
    using (var md5 = MD5.Create()) {
      foreach (var file in args) {
        // ファイル名が"-"だった場合は、標準入力に書き込まれた内容を読み込む
        using (var stream = (file == "-") ? Console.OpenStandardInput() : File.OpenRead(file)) {
          Console.WriteLine("{0}  {1}",
                            BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty).ToLowerInvariant(),
                            file);
        }

        md5.Initialize();
      }
    }
  }
}
実行結果
$ gmcs md5sum.cs
$ echo -n "hogehoge" | mono md5sum.exe ./md5sum.cs - ./md5sum.exe -
18c7d2fb4856b998a619ce9e9784bca0  ./md5sum.cs
329435e5e66be809a656af105f42401e  -
7fb4bb0cbeccc7b401237d238d92549d  ./md5sum.exe
d41d8cd98f00b204e9800998ecf8427e  -
$ echo -n "hogehoge" | md5sum ./md5sum.cs - ./md5sum.exe -
18c7d2fb4856b998a619ce9e9784bca0  ./md5sum.cs
329435e5e66be809a656af105f42401e  -
7fb4bb0cbeccc7b401237d238d92549d  ./md5sum.exe
d41d8cd98f00b204e9800998ecf8427e  -