3

I'm following through the tutorial from the book Agile Web Development with Rails and I found the following code:

def User.encrypt_password(password, salt) 
  Digest::SHA2.hexdigest(password + "wibble" + salt)
end

Looking into the Digest source code (digest.rb and digest/sha2.rb inside the lib directory in my ruby installation), however, I can't seem to find where the hexdigest method is defined, but yet the code seems to work just fine.

Can someone enlighten me how this happens? I assume that I need to look for a code that somehow looks like:

def hexdigest(...)
   ...
end
igauravsehrawat
  • 3,696
  • 3
  • 33
  • 46
ryanprayogo
  • 11,587
  • 11
  • 51
  • 66

2 Answers2

9

The hexdigest part, and several other similar methods are written as a C extension for speed. It's found in ext/digest/ in the Ruby source.

static VALUE rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self) is defined on line 216 in ext/digest/digest.c in my Ruby 1.9.2-p0 source. It just calls a bunch of other functions, but it might be a starting point at least.

For SHA2, there is another ext/digest/sha2/sha2.c that contains those functions. digest.c is just the basics, "extended" by the other ones

PerfectlyNormal
  • 4,182
  • 2
  • 35
  • 47
2

According to http://ruby-doc.org/stdlib/libdoc/digest/rdoc/classes/Digest/Class.html

Digest is implemented in digest.rb and also digest.c (native methods). I believe what is happening here is hexdigest is a class method on Digest which Digest::SHA2 inherits. The implementation of hexdigest calls the digest class method which each digest type implements and returns the result.

Ogapo
  • 551
  • 5
  • 9