module Digest::Instance
此模块为摘要实现对象提供了计算消息摘要值的实例方法。
Public Instance Methods
使用给定的字符串更新摘要并返回自身。
update() 方法和左移运算符被每个实现子类覆盖。(其中一个应该是另一个的别名)
Source
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。
Source
# File ext/digest/lib/digest.rb, line 82 def base64digest(str = nil) [str ? digest(str) : digest].pack('m0') end
如果未给出参数,则以 base64 编码的形式返回摘要的结果哈希值,并保持摘要的状态。
如果给出了一个字符串,则以 base64 编码的形式返回给定字符串的哈希值,并在处理之前和之后将摘要重置为初始状态。
无论哪种情况,返回值都将用‘=’正确填充且不包含换行符。
Source
# File ext/digest/lib/digest.rb, line 88 def base64digest! [digest!].pack('m0') end
返回结果的哈希值并重置摘要到初始状态。
Source
static VALUE
rb_digest_instance_block_length(VALUE self)
{
rb_digest_instance_method_unimpl(self, "block_length");
UNREACHABLE;
}
返回摘要的块长度。
此方法被每个实现子类覆盖。
Source
static VALUE
rb_digest_instance_bubblebabble(VALUE self)
{
return bubblebabble_str_new(rb_funcall(self, id_digest, 0));
}
以 Bubblebabble 编码形式返回结果的哈希值。
Source
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;
}
如果未给出参数,则返回摘要的结果哈希值,并保持摘要的状态。
如果给出了一个字符串,则返回给定字符串的哈希值,并在处理之前和之后将摘要重置为初始状态。
Source
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;
}
返回结果的哈希值并重置摘要到初始状态。
Source
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));
}
返回摘要的哈希值的长度。
此方法应由每个实现子类覆盖。如果未覆盖,则返回 digest_obj.digest().length()。
Source
# 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
使用给定文件名的内容更新摘要并返回自身。
Source
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);
}
如果未给出参数,则以十六进制编码的形式返回摘要的结果哈希值,并保持摘要的状态。
如果给出了一个字符串,则以十六进制编码的形式返回给定字符串的哈希值,并在处理之前和之后将摘要重置为初始状态。
Source
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);
}
以十六进制编码的形式返回结果的哈希值并重置摘要到初始状态。
Source
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;
}
创建摘要对象的打印版本。
Source
static VALUE
rb_digest_instance_length(VALUE self)
{
return rb_funcall(self, id_digest_length, 0);
}
返回 digest_obj.digest_length()。
Source
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()。
Source
static VALUE
rb_digest_instance_reset(VALUE self)
{
rb_digest_instance_method_unimpl(self, "reset");
UNREACHABLE;
}
将摘要重置为初始状态并返回自身。
此方法被每个实现子类覆盖。
Source
static VALUE
rb_digest_instance_to_s(VALUE self)
{
return rb_funcall(self, id_hexdigest, 0);
}
返回 digest_obj.hexdigest()。
Source
static VALUE
rb_digest_instance_update(VALUE self, VALUE str)
{
rb_digest_instance_method_unimpl(self, "update");
UNREACHABLE;
}
使用给定的字符串更新摘要并返回自身。
update() 方法和左移运算符被每个实现子类覆盖。(其中一个应该是另一个的别名)
私有实例方法
Source
static VALUE
rb_digest_instance_finish(VALUE self)
{
rb_digest_instance_method_unimpl(self, "finish");
UNREACHABLE;
}
完成摘要并返回结果的哈希值。
此方法被每个实现子类覆盖,并且通常被设为私有,因为其中一些子类可能未初始化内部数据。请勿从外部调用此方法。请使用 digest!() 代替,它确保为安全起见重置内部数据。