Class: Digest::Base (Ruby 2.4.2)
Description: Class : Digest::Base - Ruby 2.4.2

Support for the Ruby 2.4 series has ended. See here for reference.

### Home Classes Methods

### In Files

- digest/bubblebabble/bubblebabble.c

### Parent

Digest::Class

### Methods

- #<<
- #block_length
- #digest_length
- #reset
- #update

### Class/Module Index

Quicksearch

- Digest
- Digest::Base
- Digest::Class
- Digest::Instance
- Digest::MD5
- Digest::RMD160
- Digest::SHA1
- Digest::SHA2
- Object

No matching classes.

# Digest::Base

This abstract class provides a common interface to message digest implementation classes written in C.

## Write a `Digest` subclass in C¶ ↑

`Digest::Base` provides a common interface to message digest classes written in C. These classes must provide a struct of type rb_digest_metadata_t:

    typedef int (*rb_digest_hash_init_func_t)(void *);
    typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t);
    typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *);

    typedef struct {
      int api_version;
      size_t digest_len;
      size_t block_len;
      size_t ctx_size;
      rb_digest_hash_init_func_t init_func;
      rb_digest_hash_update_func_t update_func;
      rb_digest_hash_finish_func_t finish_func;
    } rb_digest_metadata_t;

This structure must be set as an instance variable named `metadata` (without the +@+ in front of the name). By example:

     static const rb_digest_metadata_t sha1 = {
        RUBY_DIGEST_API_VERSION,
        SHA1_DIGEST_LENGTH,
        SHA1_BLOCK_LENGTH,
        sizeof(SHA1_CTX),
        (rb_digest_hash_init_func_t)SHA1_Init,
        (rb_digest_hash_update_func_t)SHA1_Update,
        (rb_digest_hash_finish_func_t)SHA1_Finish,
    };

    rb_ivar_set(cDigest_SHA1, rb_intern("metadata"),
                Data_Wrap_Struct(0, 0, 0, (void *)&sha1));

### Public Instance Methods

digest_base << string → digest_base click to toggle source

Update the digest using given string and return `self`.

                   static VALUE
    rb_digest_base_update(VALUE self, VALUE str)
    {
        rb_digest_metadata_t *algo;
        void *pctx;

        algo = get_digest_base_metadata(rb_obj_class(self));

        TypedData_Get_Struct(self, void, &digest_type, pctx);

        StringValue(str);
        algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str));
        RB_GC_GUARD(str);

        return self;
    }

block_length → Integer click to toggle source

Return the block length of the digest in bytes.

                   static VALUE
    rb_digest_base_block_length(VALUE self)
    {
        rb_digest_metadata_t *algo;

        algo = get_digest_base_metadata(rb_obj_class(self));

        return INT2NUM(algo->block_len);
    }

digest_length → Integer click to toggle source

Return the length of the hash value in bytes.

                   static VALUE
    rb_digest_base_digest_length(VALUE self)
    {
        rb_digest_metadata_t *algo;

        algo = get_digest_base_metadata(rb_obj_class(self));

        return INT2NUM(algo->digest_len);
    }

reset → digest_base click to toggle source

Reset the digest to its initial state and return `self`.

                   static VALUE
    rb_digest_base_reset(VALUE self)
    {
        rb_digest_metadata_t *algo;
        void *pctx;

        algo = get_digest_base_metadata(rb_obj_class(self));

        TypedData_Get_Struct(self, void, &digest_type, pctx);

        algo_init(algo, pctx);

        return self;
    }

update(string) → digest_base click to toggle source

Update the digest using given string and return `self`.

                   static VALUE
    rb_digest_base_update(VALUE self, VALUE str)
    {
        rb_digest_metadata_t *algo;
        void *pctx;

        algo = get_digest_base_metadata(rb_obj_class(self));

        TypedData_Get_Struct(self, void, &digest_type, pctx);

        StringValue(str);
        algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str));
        RB_GC_GUARD(str);

        return self;
    }