2

我正在阅读Agile Web Development with Rails一书中的教程,我发现了以下代码:

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

但是,查看Digest源代码(digest.rb以及digest/sha2.rblib我的 ruby​​ 安装目录中),我似乎无法找到该hexdigest方法的定义位置,但代码似乎工作得很好。

有人能告诉我这是怎么发生的吗?我假设我需要寻找一个看起来像这样的代码:

def hexdigest(...)
   ...
end
4

2 回答 2

8

hexdigest部分和其他几个类似的方法被编写为 C 扩展以提高速度。它可以在ext/digest/Ruby 源代码中找到。

static VALUE rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)ext/digest/digest.c在我的 Ruby 1.9.2-p0 源代码的第 216 行定义。它只是调用了一堆其他函数,但至少它可能是一个起点。

对于 SHA2,还有另一个ext/digest/sha2/sha2.c包含这些函数。digest.c只是基础,由其他“扩展”

于 2011-01-13T22:25:12.803 回答
1

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

Digest 在digest.rb 和digest.c(本机方法)中实现。我相信这里发生的是 hexdigest 是 Digest::SHA2 继承的 Digest 上的一个类方法。hexdigest 的实现调用每个digest 类型实现的digest 类方法并返回结果。

于 2011-01-13T22:28:12.667 回答