# Cryptographic Hashing in R

#### 2019-07-16

The functions `sha1`, `sha256`, `sha512`, `md4`, `md5` and `ripemd160` bind to the respective digest functions in OpenSSL’s libcrypto. Both binary and string inputs are supported and the output type will match the input type.

    md5("foo")

    [1] "acbd18db4cc2f85cedef654fccc4a4d8"

    md5(charToRaw("foo"))

    md5 ac:bd:18:db:4c:c2:f8:5c:ed:ef:65:4f:cc:c4:a4:d8

Functions are fully vectorized for the case of character vectors: a vector with n strings will return n hashes.

    # Vectorized for strings
    md5(c("foo", "bar", "baz"))

    [1] "acbd18db4cc2f85cedef654fccc4a4d8" "37b51d194a7513e45b56f6524f2d51f2"
    [3] "73feffa4b7f6bb68e44cf984c85f6e88"

Besides character and raw vectors we can pass a connection object (e.g. a file, socket or url). In this case the function will stream-hash the binary contents of the connection.

    # Stream-hash a file
    myfile <- system.file("CITATION")
    md5(file(myfile))

    md5 16:a3:1a:bf:39:26:86:31:f2:0e:14:78:bf:64:d6:59

Same for URLs. The hash of the `R-3.1.1-win.exe` below should match the one in `md5sum.txt`

    # Stream-hash from a network connection
    md5(url("http://cran.us.r-project.org/bin/windows/base/old/3.1.1/R-3.1.1-win.exe"))

## Compare to digest

Similar functionality is also available in the digest package, but with a slightly different interface:

    # Compare to digest
    library(digest)

    Attaching package: 'digest'

    The following object is masked from 'package:openssl':

        sha1

    digest("foo", "md5", serialize = FALSE)

    [1] "acbd18db4cc2f85cedef654fccc4a4d8"

    # Other way around
    digest(cars, skip = 0)

    [1] "36bf411a03c63085da45463f99f228e8"

    md5(serialize(cars, NULL))

    md5 50:45:3e:3c:8e:5f:9b:76:9f:40:fe:26:c0:36:f2:b2