# Digests - Vapor Docs

Skip to content


# Message Digests

Cryptographic hash functions (also known as message digest algorithms) convert data of arbitrary size to a fixed-size digest. These are most often used for generating checksums or identifiers for large data blobs.

Read more about Cryptographic hash functions on Wikipedia.

## Hash

Use the global convenience variables to create hashes using common algorithms.

    import Crypto

    let digest = try SHA1.hash("hello")
    print(digest.hexEncodedString()) // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

See the Crypto module's global variables for a list of all available hash algorithms.

### Streaming

You can create a `Digest` manually and use its instance methods to create a hash for one or more data chunks.

    var sha256 = try Digest(algorithm: .sha256)
    try sha256.reset()
    try sha256.update(data: "hello")
    try sha256.update(data: "world")
    let digest = try sha256.finish()
    print(digest) /// Data

## BCrypt

BCrypt is a popular hashing algorithm that has configurable complexity and handles salting automatically.

### Hash

Use the `hash(_:cost:salt:)` method to create BCrypt hashes.

    let digest = try BCrypt.hash("vapor", cost: 4)
    print(digest) /// data

Increasing the `cost` value will make hashing and verification take longer.

### Verify

Use the `verify(_:created:)` method to verify that a BCrypt hash was created by a given plaintext input.

    let hash = try BCrypt.hash("vapor", cost: 4)
    try BCrypt.verify("vapor", created: hash) // true
    try BCrypt.verify("foo", created: hash) // false

## HMAC

HMAC is an algorithm for creating keyed hashes. HMAC will generate different hashes for the same input if different keys are used.

    let digest = try HMAC.SHA1.authenticate("vapor", key: "secret")
    print(digest.hexEncodedString()) // digest

See the `HMAC` class for a list of all available hash algorithms.

### Streaming

HMAC hashes can also be streamed. The API is identical to hash streaming.