---
name: "Digest"
section: "3o"
platform: "linux"
package: "ocaml"
version: "5.5.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Digest/3o"
---

# Digest(3o)

Message digest.

## NAME

Digest - Message digest.

## Module

Module   Digest

## Documentation

Module **Digest**\
  :  **sig end**

Message digest.

This module provides functions to compute 'digests', also known as 'hashes', of arbitrary-length strings or files. The supported hashing algorithms are BLAKE2 and MD5.

### Basic functions

The functions in this section use the MD5 hash function to produce 128-bit digests (16 bytes).  MD5 is not cryptographically secure. Hence, these functions should not be used for security-sensitive applications.  The BLAKE2 functions below are cryptographically secure.

*type t* =  **string**

The type of digests: 16-byte strings.

*val compare* :  **t -\> t -\> int**

The comparison function for 16-byte digests, with the same specification as  **compare** and the implementation shared with  **String.compare** . Along with the type  **t** , this function  **compare** allows the module  **Digest** to be passed as argument to the functors  **Set.Make** and  **Map.Make** .

**Since** 4.00

*val equal* :  **t -\> t -\> bool**

The equal function for 16-byte digests.

**Since** 4.03

*val string* :  **string -\> t**

Return the digest of the given string.

*val bytes* :  **bytes -\> t**

Return the digest of the given byte sequence.

**Since** 4.02

*val substring* :  **string -\> int -\> int -\> t**

**Digest.substring s ofs len** returns the digest of the substring of  **s** starting at index  **ofs** and containing  **len** characters.

*val subbytes* :  **bytes -\> int -\> int -\> t**

**Digest.subbytes s ofs len** returns the digest of the subsequence of  **s** starting at index  **ofs** and containing  **len** bytes.

**Since** 4.02

*val channel* :  **in\_channel -\> int -\> t**

If  **len** is nonnegative,  **Digest.channel ic len** reads  **len** characters from channel  **ic** and returns their digest, or raises **End\_of\_file** if end-of-file is reached before  **len** characters are read.  If  **len** is negative,  **Digest.channel ic len** reads all characters from  **ic** until end-of-file is reached and return their digest.

*val file* :  **string -\> t**

Return the digest of the file whose name is given.

*val output* :  **out\_channel -\> t -\> unit**

Write a digest on the given output channel.

*val input* :  **in\_channel -\> t**

Read a digest from the given input channel.

*val to\_hex* :  **t -\> string**

Return the printable hexadecimal representation of the given digest.

**Raises Invalid\_argument** if the argument is not exactly 16 bytes.

*val of\_hex* :  **string -\> t**

Convert a hexadecimal representation back into the corresponding digest.

**Since** 5.2

**Raises Invalid\_argument** if the argument is not exactly 32 hexadecimal characters.

*val from\_hex* :  **string -\> t**

Same function as  **Digest.of\_hex** .

**Since** 4.00

### Generic interface

*module type S =* **sig end**

The signature for a hash function that produces digests of length **hash\_length** from character strings, byte arrays, and files.

**Since** 5.2

### Specific hash functions

*module BLAKE128 :* **S**

**BLAKE128** is the BLAKE2b hash function producing 128-bit (16-byte) digests.  It is cryptographically secure. However, the small size of the digests enables brute-force attacks in  **2{^64}** attempts.

**Since** 5.2

*module BLAKE256 :* **S**

**BLAKE256** is the BLAKE2b hash function producing 256-bit (32-byte) digests.  It is cryptographically secure, and the digests are large enough to thwart brute-force attacks.

**Since** 5.2

*module BLAKE512 :* **S**

**BLAKE512** is the BLAKE2b hash function producing 512-bit (64-byte) digests.  It is cryptographically secure, and the digests are large enough to thwart brute-force attacks.

**Since** 5.2

*module MD5 :* **S**

**MD5** is the MD5 hash function.  It produces 128-bit (16-byte) digests and is not cryptographically secure at all. It should be used only for compatibility with earlier designs that mandate the use of MD5.

**Since** 5.2
