Digest::Instance 模块
此模块为摘要实现对象提供实例方法,用于计算消息摘要值。
公共实例方法
使用给定的 string 更新摘要并返回自身。
update() 方法和左移运算符由每个实现子类重写。(一个应该是另一个的别名)
如果给定字符串,则检查它是否等于摘要对象的十六进制编码哈希值。如果给定另一个摘要实例,则检查它们是否具有相同的哈希值。否则返回 false。
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; }
如果没有给出任何内容,则返回摘要的哈希值(以 base64 编码形式),同时保持摘要的状态。
如果给定一个 string
,则返回给定 string
的哈希值(以 base64 编码形式),在该过程中之前和之后将摘要重置为初始状态。
在任何情况下,返回值都用“=”正确填充,并且不包含换行符。
# File ext/digest/lib/digest.rb, line 82 def base64digest(str = nil) [str ? digest(str) : digest].pack('m0') end
返回结果哈希值并将摘要重置为初始状态。
# File ext/digest/lib/digest.rb, line 88 def base64digest! [digest!].pack('m0') end
返回摘要的块长度。
此方法由每个实现子类覆盖。
static VALUE rb_digest_instance_block_length(VALUE self) { rb_digest_instance_method_unimpl(self, "block_length"); UNREACHABLE; }
以 Bubblebabble 编码形式返回结果哈希值。
static VALUE rb_digest_instance_bubblebabble(VALUE self) { return bubblebabble_str_new(rb_funcall(self, id_digest, 0)); }
如果没有给出,则返回摘要的结果哈希值,同时保留摘要的状态。
如果给出了字符串,则返回给定字符串的哈希值,在该过程中之前和之后将摘要重置为初始状态。
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; }
返回摘要的哈希值长度。
此方法应由每个实现子类覆盖。如果没有,则返回 digest_obj.digest().length()。
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 LONG2NUM(RSTRING_LEN(digest)); }
使用给定文件名称的内容更新摘要并返回自身。
# File ext/digest/lib/digest.rb, line 63 def file(name) File.open(name, "rb") {|f| buf = "" while f.read(16384, buf) update buf end } self end
如果没有给出,则以十六进制编码形式返回摘要的结果哈希值,同时保留摘要的状态。
如果给出了字符串,则以十六进制编码形式返回给定字符串的哈希值,在该过程中之前和之后将摘要重置为初始状态。
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; }
返回 digest_obj.digest_length()。
static VALUE rb_digest_instance_length(VALUE self) { return rb_funcall(self, id_digest_length, 0); }
返回一个新的、已初始化的摘要对象副本。等同于 digest_obj.clone().reset()。
static VALUE rb_digest_instance_new(VALUE self) { VALUE clone = rb_obj_clone(self); rb_funcall(clone, id_reset, 0); return clone; }
将摘要重置为初始状态并返回自身。
此方法由每个实现子类覆盖。
static VALUE rb_digest_instance_reset(VALUE self) { rb_digest_instance_method_unimpl(self, "reset"); UNREACHABLE; }
返回 digest_obj.hexdigest()。
static VALUE rb_digest_instance_to_s(VALUE self) { return rb_funcall(self, id_hexdigest, 0); }
使用给定的 string 更新摘要并返回自身。
update() 方法和左移运算符由每个实现子类重写。(一个应该是另一个的别名)
static VALUE rb_digest_instance_update(VALUE self, VALUE str) { rb_digest_instance_method_unimpl(self, "update"); UNREACHABLE; }
私有实例方法
完成摘要并返回结果哈希值。
此方法由每个实现子类覆盖,并且通常设为私有,因为其中一些子类可能会使内部数据未初始化。不要从外部调用此方法。请改用 digest!()
,它确保出于安全原因重置内部数据。
static VALUE rb_digest_instance_finish(VALUE self) { rb_digest_instance_method_unimpl(self, "finish"); UNREACHABLE; }