Где определяется Digest :: SHA2.hexdigest ()? - PullRequest
1 голос
/ 14 января 2011

Я изучаю учебник из книги Agile Web Development с Rails и обнаружил следующий код:

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

Просмотр исходного кода Digest (digest.rb и digest/sha2.rb внутри директории lib в моей установке ruby), однако я не могу найти, где определен метод hexdigest, но, тем не менее, код, кажется, работает просто отлично.

Может кто-нибудь просветить меня, как это происходит?Я предполагаю, что мне нужно искать код, который так или иначе выглядит так:

def hexdigest(...)
   ...
end

Ответы [ 2 ]

8 голосов
/ 14 января 2011

Часть hexdigest и некоторые другие подобные методы написаны как расширение C для скорости. Он найден в ext/digest/ в источнике Ruby.

static VALUE rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self) определено в строке 216 в ext/digest/digest.c в моем источнике Ruby 1.9.2-p0. Он просто вызывает кучу других функций, но, по крайней мере, может стать отправной точкой.

Для SHA2 есть еще ext/digest/sha2/sha2.c, который содержит эти функции. digest.c это просто основы, «расширенные» другими

1 голос
/ 14 января 2011

Согласно http://ruby -doc.org / stdlib / libdoc / digest / rdoc / classes / Digest / Class.html

Дайджест реализован в digest.rb, а также в digest.c (нативные методы). Я считаю, что здесь происходит то, что hexdigest - это метод класса в Digest, который наследует Digest :: SHA2. Реализация hexdigest вызывает метод класса дайджеста, который реализует каждый тип дайджеста, и возвращает результат.

...