MD5を取得して表示するのをいろんな言語で書いてみた

まとめリンク: 同じことをいろんな言語で書いてみたシリーズ



C++

// g++ -lcrypto md5.cpp -o md5 などとしてコンパイル
#include <iostream>
#include <openssl/md5.h>
int main(int argc, char *argv[])
{
  std::string dat = "Hello World!"; // MD5を取得するデータ
  unsigned char md5_result[MD5_DIGEST_LENGTH];
  MD5((unsigned char*) dat.c_str(), dat.length(), md5_result);
  for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
    std::cout << std::hex << (unsigned int) md5_result[i];
  std::cout << std::endl;
  return 0;
}

C++ (ファイル入力バージョン)

// g++ -lcrypto md5.cpp -o md5 などとしてコンパイル
#include <iostream>
#include <fstream>
#include <openssl/md5.h>
int main(int argc, char *argv[])
{
  std::string filename = "./data_file_name";  // MD5を取得したいファイル名
  std::ifstream ifs(filename.c_str(), std::ios::in | std::ios::binary);
  if (!ifs){
    std::cout << "ファイルが見つかりませんでした" << std::endl;
    return 1;
  }
  ifs.seekg(0, std::ios::end);
  long long int dat_size = ifs.tellg();
  ifs.seekg(0);
  char *dat = new char[dat_size];
  ifs.read(dat, dat_size);
  unsigned char md5_result[MD5_DIGEST_LENGTH];
  MD5((unsigned char*) dat, dat_size, md5_result);
  for(int i = 0; i < MD5_DIGEST_LENGTH; i++)
    std::cout << std::hex << (unsigned int) md5_result[i];
  std::cout << std::endl;
  delete[] dat;
  ifs.close();
  return 0;
}


Ruby

require "digest/md5"
dat = "Hello World!" # MD5を取得するデータ
puts(Digest::MD5.hexdigest(dat))

Ruby (ファイル入力バージョン)

require "digest/md5"
filename = "./data_file_name" # MD5を取得したいファイル名
dat = File.read(filename)
puts(Digest::MD5.hexdigest(dat))


Crystal

require "digest"
dat = "Hello World!" # MD5を取得するデータ
puts(Digest::MD5.hexdigest(dat))

Crystal (ファイル入力バージョン)

require "digest"
filename = "./data_file_name" # MD5を取得したいファイル名
dat = File.read(filename)
puts(Digest::MD5.hexdigest(dat))


Rust

// https://crates.io/crates/md5 を使用した例
fn main() {
  let dat: &str = "Hello World!"; // MD5を取得するデータ
  println!("{}", format!("{:x}", md5::compute(&dat)));
}

Rust (ファイル入力バージョン)

// https://crates.io/crates/md5 を使用した例
use std::io::prelude::*;
fn main() {
  let filename: &str = "./data_file_name"; // MD5を取得したいファイル名
  let mut f = std::fs::File::open(filename).expect("ファイルが見つかりませんでした");
  let mut dat = Vec::new();
  let _ = f.read_to_end(&mut dat).expect("ファイルの読み込みで問題が発生しました");
  println!("{}", format!("{:x}", md5::compute(&dat)));
}


Python3

import hashlib
dat = b'Hello World!' # MD5を取得するデータ
print(hashlib.md5(dat).hexdigest())

Python3 (ファイル入力バージョン)

import hashlib
filename = "./data_file_name" # MD5を取得したいファイル名
dat = open(filename, "rb").read()
print(hashlib.md5(dat).hexdigest())


Node.js

'use strict'
const dat = "Hello World!"; // MD5を取得するデータ
console.log(
  require("crypto").createHash("md5").update(dat, "binary").digest("hex")
);

Node.js (ファイル入力バージョン)

'use strict'
const filename = "./data_file_name" // MD5を取得したいファイル名
require("fs").readFile(
  filename,
  "binary",
  (err, dat) => {
    console.log(
      require("crypto").createHash("md5").update(dat, "binary").digest("hex")
    );
  }
);


C#

using System.Security.Cryptography;
using System.Text;
String dat = "Hello World!"; // MD5を取得するデータ
byte[] dat_byte = Encoding.GetEncoding("UTF-8").GetBytes(dat);
MD5 md5 = MD5.Create();
byte[] md5_result = md5.ComputeHash(dat_byte);
for (int i=0; i < md5_result.Length; i++) {
  Console.Write(md5_result[i].ToString("x2"));
}
Console.WriteLine("");

C# (ファイル入力バージョン)

using System.Security.Cryptography;
using System.Text;
String filename = "./data_file_name"; // MD5を取得したいファイル名
byte[] dat_byte = File.ReadAllBytes(filename);
MD5 md5 = MD5.Create();
byte[] md5_result = md5.ComputeHash(dat_byte);
for (int i=0; i < md5_result.Length; i++) {
  Console.Write(md5_result[i].ToString("x2"));
}
Console.WriteLine("");