модуль Digest::Instance
Этот модуль предоставляет методы экземпляров для объекта реализации дайджеста для вычисления значений дайджеста сообщения.
Открытые методы экземпляров
static VALUE
rb_digest_instance_update(VALUE self, VALUE str)
{
rb_digest_instance_method_unimpl(self, "update");
UNREACHABLE;
} Обновляет дайджест с использованием заданной строки и возвращает self.
Метод update() и оператор левого сдвига переопределяются каждым подклассом реализации. (Один должен быть алиасом для другого)
static VALUE
rb_digest_instance_equal(VALUE self, VALUE other)
{
VALUE str1, str2;
if (rb_obj_is_kind_of(other, rb_mDigest_Instance) == Qtrue) {
str1 = rb_digest_instance_digest(0, 0, self);
str2 = rb_digest_instance_digest(0, 0, other);
} else {
str1 = rb_digest_instance_to_s(self);
str2 = rb_check_string_type(other);
if (NIL_P(str2)) return Qfalse;
}
/* never blindly assume that subclass methods return strings */
StringValue(str1);
StringValue(str2);
if (RSTRING_LEN(str1) == RSTRING_LEN(str2) &&
rb_str_cmp(str1, str2) == 0) {
return Qtrue;
}
return Qfalse;
} Если задана строка, проверяет, равна ли она шестнадцатерично закодированному значению хэша объекта дайджеста. Если задан другой экземпляр дайджеста, проверяет, имеют ли они одинаковое значение хэша. В противном случае возвращает false.
# File ext/digest/lib/digest.rb, line 68
def base64digest(str = nil)
[str ? digest(str) : digest].pack('m0')
end Если не задано, возвращает результирующее значение хэша дайджеста в формате, закодированном в base64, сохраняя состояние дайджеста.
Если задан string, возвращает значение хэша для данной string в формате, закодированном в base64, сбрасывая состояние дайджеста до начального состояния до и после процесса.
В любом случае возвращаемое значение должным образом дополняется '=' и не содержит символов перевода строки.
# File ext/digest/lib/digest.rb, line 74
def base64digest!
[digest!].pack('m0')
end Возвращает результирующее значение хэша и сбрасывает состояние дайджеста до начального состояния.
static VALUE
rb_digest_instance_block_length(VALUE self)
{
rb_digest_instance_method_unimpl(self, "block_length");
UNREACHABLE;
} Возвращает длину блока дайджеста.
Этот метод переопределяется каждым подклассом реализации.
static VALUE
rb_digest_instance_bubblebabble(VALUE self)
{
return bubblebabble_str_new(rb_funcall(self, id_digest, 0));
} Возвращает результирующее значение хэша в формате Bubblebabble.
static VALUE
rb_digest_instance_digest(int argc, VALUE *argv, VALUE self)
{
VALUE str, value;
if (rb_scan_args(argc, argv, "01", &str) > 0) {
rb_funcall(self, id_reset, 0);
rb_funcall(self, id_update, 1, str);
value = rb_funcall(self, id_finish, 0);
rb_funcall(self, id_reset, 0);
} else {
value = rb_funcall(rb_obj_clone(self), id_finish, 0);
}
return value;
} Если не задано, возвращает результирующее значение хэша дайджеста, сохраняя состояние дайджеста.
Если задана строка, возвращает значение хэша для данной строки, сбрасывая состояние дайджеста до начального состояния до и после процесса.
static VALUE
rb_digest_instance_digest_bang(VALUE self)
{
VALUE value = rb_funcall(self, id_finish, 0);
rb_funcall(self, id_reset, 0);
return value;
} Возвращает результирующее значение хэша и сбрасывает состояние дайджеста до начального состояния.
static VALUE
rb_digest_instance_digest_length(VALUE self)
{
/* subclasses really should redefine this method */
VALUE digest = rb_digest_instance_digest(0, 0, self);
/* never blindly assume that #digest() returns a string */
StringValue(digest);
return INT2NUM(RSTRING_LEN(digest));
} Возвращает длину значения хэша дайджеста.
Этот метод должен быть переопределен каждым подклассом реализации. Если нет, возвращается digest_obj.digest().length().
# File ext/digest/lib/digest.rb, line 49
def file(name)
File.open(name, "rb") {|f|
buf = ""
while f.read(16384, buf)
update buf
end
}
self
end Обновляет дайджест содержимым заданного файла имя и возвращает self.
static VALUE
rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)
{
VALUE str, value;
if (rb_scan_args(argc, argv, "01", &str) > 0) {
rb_funcall(self, id_reset, 0);
rb_funcall(self, id_update, 1, str);
value = rb_funcall(self, id_finish, 0);
rb_funcall(self, id_reset, 0);
} else {
value = rb_funcall(rb_obj_clone(self), id_finish, 0);
}
return hexencode_str_new(value);
} Если не задано, возвращает результирующее значение хэша дайджеста в шестнадцатеричном кодированном формате, сохраняя состояние дайджеста.
Если задана строка, возвращает значение хэша для данной строки в шестнадцатеричном кодированном формате, сбрасывая состояние дайджеста до начального состояния до и после процесса.
static VALUE
rb_digest_instance_hexdigest_bang(VALUE self)
{
VALUE value = rb_funcall(self, id_finish, 0);
rb_funcall(self, id_reset, 0);
return hexencode_str_new(value);
} Возвращает результирующее значение хэша в шестнадцатеричном кодированном формате и сбрасывает состояние дайджеста до начального состояния.
static VALUE
rb_digest_instance_inspect(VALUE self)
{
VALUE str;
size_t digest_len = 32; /* about this size at least */
const char *cname;
cname = rb_obj_classname(self);
/* #<Digest::ClassName: xxxxx...xxxx> */
str = rb_str_buf_new(2 + strlen(cname) + 2 + digest_len * 2 + 1);
rb_str_buf_cat2(str, "#<");
rb_str_buf_cat2(str, cname);
rb_str_buf_cat2(str, ": ");
rb_str_buf_append(str, rb_digest_instance_hexdigest(0, 0, self));
rb_str_buf_cat2(str, ">");
return str;
} Создает печатную версию объекта дайджеста.
static VALUE
rb_digest_instance_length(VALUE self)
{
return rb_funcall(self, id_digest_length, 0);
} Возвращает digest_obj.digest_length().
static VALUE
rb_digest_instance_new(VALUE self)
{
VALUE clone = rb_obj_clone(self);
rb_funcall(clone, id_reset, 0);
return clone;
} Возвращает новую, инициализированную копию объекта дайджеста. Эквивалентно digest_obj.clone().reset().
static VALUE
rb_digest_instance_reset(VALUE self)
{
rb_digest_instance_method_unimpl(self, "reset");
UNREACHABLE;
} Сбрасывает дайджест до начального состояния и возвращает self.
Этот метод переопределяется каждым подклассом реализации.
static VALUE
rb_digest_instance_length(VALUE self)
{
return rb_funcall(self, id_digest_length, 0);
} Возвращает digest_obj.digest_length().
static VALUE
rb_digest_instance_to_s(VALUE self)
{
return rb_funcall(self, id_hexdigest, 0);
} Возвращает digest_obj.hexdigest().
static VALUE
rb_digest_instance_update(VALUE self, VALUE str)
{
rb_digest_instance_method_unimpl(self, "update");
UNREACHABLE;
} Обновляет дайджест с использованием заданной строки и возвращает self.
Метод update() и оператор левого сдвига переопределяются каждым подклассом реализации. (Один должен быть алиасом для другого)
Закрытые методы экземпляров
static VALUE
rb_digest_instance_finish(VALUE self)
{
rb_digest_instance_method_unimpl(self, "finish");
UNREACHABLE;
} Завершает дайджест и возвращает результирующее значение хэша.
Этот метод переопределяется каждым подклассом реализации и часто делается закрытым, потому что некоторые из этих подклассов могут оставлять внутренние данные неинициализированными. Не вызывайте этот метод извне. Используйте digest!() вместо этого, что гарантирует сброс внутренних данных по соображениям безопасности.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.