Go MD5 Hash Code Example (Online Runner)

Go MD5 hashing code example with runnable snippets to calculate MD5 for text and files.

Online calculator: use the site MD5 text tool.

Calculation method

Use crypto/md5, hash UTF-8 bytes, and encode the 16-byte digest as hex.

Implementation notes

  • Package: built-in crypto/md5.
  • Implementation: file hashing streams bytes to avoid loading large files into memory.
  • Notes: MD5 is broken for collision resistance; use it only for legacy checksums.

Text hashing example

go
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
)

func md5Text(text string) string {
	sum := md5.Sum([]byte(text))
	return hex.EncodeToString(sum[:])
}

func main() {
	fmt.Println(md5Text("hello world"))
}

File hashing example

go
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
	"os"
)

func md5File(path string) (string, error) {
	file, err := os.Open(path)
	if err != nil {
		return "", err
	}
	defer file.Close()

	hash := md5.New()
	if _, err := io.Copy(hash, file); err != nil {
		return "", err
	}
	return hex.EncodeToString(hash.Sum(nil)), nil
}

func main() {
	file, err := os.CreateTemp("", "md5-example-*.bin")
	if err != nil {
		panic(err)
	}
	defer os.Remove(file.Name())
	if _, err := file.Write([]byte("example payload\n")); err != nil {
		panic(err)
	}
	if err := file.Close(); err != nil {
		panic(err)
	}

	value, err := md5File(file.Name())
	if err != nil {
		panic(err)
	}
	fmt.Println(value)
}

Complete script (implementation + tests)

go
package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
	"os"
)

func md5Hex(data []byte) string {
	sum := md5.Sum(data)
	return hex.EncodeToString(sum[:])
}

func md5Text(text string) string {
	return md5Hex([]byte(text))
}

func md5File(path string) (string, error) {
	file, err := os.Open(path)
	if err != nil {
		return "", err
	}
	defer file.Close()

	hash := md5.New()
	if _, err := io.Copy(hash, file); err != nil {
		return "", err
	}
	return hex.EncodeToString(hash.Sum(nil)), nil
}

func main() {
	vectors := map[string]string{
		"":                "d41d8cd98f00b204e9800998ecf8427e",
		"abc":             "900150983cd24fb0d6963f7d28e17f72",
		"message digest":  "f96b697d7cb7938d525a2f31aaf161d0",
		"abcdefghijklmnopqrstuvwxyz": "c3fcd3d76192e4007dfb496cca67e13b",
	}

	for input, expected := range vectors {
		if got := md5Text(input); got != expected {
			panic(fmt.Sprintf("MD5 mismatch for %q: %s != %s", input, got, expected))
		}
	}

	file, err := os.CreateTemp("", "md5-example-*.bin")
	if err != nil {
		panic(err)
	}
	defer os.Remove(file.Name())
	if _, err := file.Write([]byte("example payload\n")); err != nil {
		panic(err)
	}
	if err := file.Close(); err != nil {
		panic(err)
	}

	fileHash, err := md5File(file.Name())
	if err != nil {
		panic(err)
	}
	fmt.Println("md5(file)=", fileHash)
	fmt.Println("All MD5 test vectors passed.")
}