Chekseum is a library which implements ADLER-32 and CRC32C Cyclic Redundancy Check. It provides 2 implementation, the first in C and the second in OCaml. The library is on top of optint to get the best representation of the CRC in the OCaml world.
Then, as digestif, checkseum uses the linking trick. So if you want to use checkseum in a library, you can link with the checkseum package which does not provide an implementation. Then, end-user can choose between the C implementation or the OCaml implementation (both work on Mirage).
So, in utop, to be able to fully use checkseum, you need to write:
$ utop -require checkseum.cor
$ utop -require checkseum.ocamlIn a dune workspace, the build-system is able to choose silently default implementation (checkseum.c) for your executable if you don't specify one of them. A dune-library is not able to choose an implementatio but still able to use the virtual library checkseum.
The trick permits us to compile checkseum with js_of_ocaml.
checkseum was made to provide a Adler-32 or a CRC-32 implementation regardless the architecture - it takes the advantage of optint to get in any situation a 32-bits integer. However, it takes the advantage of the immediate int value for a 64-bits architecture (which let us to use, at most, 63 bits).
The C implementation provides the cheapest FFI between OCaml and C via annotations such as [@untagged] or [@unboxed].
This is a simple example of how to use checkseum with CRC-32:
$ cat >digest.ml <<EOF
let digest ic =
let tmp = Bytes.create 0x1000 in
let rec go crc32 = match input ic tmp 0 0x1000 with
| 0 -> crc32
| len ->
Checkseum.Crc32.digest_bytes tmp 0 len crc32 |> go
| exception End_of_file -> crc32 in
go Checkseum.Crc32.default
let () = match Sys.argv with
| [| _; filename |] when Sys.file_exists filename ->
let ic = open_in filename in
let crc32 = digest ic in
close_in ic ; Format.printf "%a\n%!" Checkseum.Crc32.pp crc32
| [| _ |] ->
let crc32 = digest stdin in
Format.printf "%a\n%!" Checkseum.Crc32.pp crc32
| _ -> Format.eprintf "%s [<filename>]\n%!" Sys.argv.(0)
EOF
$ cat >dune <<EOF
(executable
(name digest)
(libraries checkseum))
EOF
$ dune exec ./digest.exe -- digest.ml
3995955175With the dune's profile benchmark (which requires bechamel), the user is able to produce a bench/main.html which compares checkseum.c with tcpip.