模組 Digest::Instance

此模組提供訊息摘要物件實作的實例方法,用於計算訊息摘要值。

公開實例方法

digest_obj << string → digest_obj

使用指定的 *字串* 更新摘要,並傳回自身。

update() 方法和左移運算子會由各實作子類別覆寫。(其中一個應該是另一個的別名)

別名:update
digest_obj == another_digest_obj → boolean 按一下以切換來源
digest_obj == string → boolean

如果指定字串,檢查它是否等於摘要物件的十六進位編碼雜湊值。如果指定另一個摘要實例,檢查它們是否具有相同的雜湊值。否則傳回 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;
}
base64digest(str = nil) 按一下以切換來源

如果未指定任何內容,傳回摘要的結果雜湊值,使用 base64 編碼形式,並保留摘要狀態。

如果指定 字串,傳回指定 字串 的雜湊值,使用 base64 編碼形式,並在處理前後將摘要重設為初始狀態。

在任何情況下,傳回值都使用「=」適當填補,且不包含換行符。

# File ext/digest/lib/digest.rb, line 82
def base64digest(str = nil)
  [str ? digest(str) : digest].pack('m0')
end
base64digest!() 按一下以切換來源

傳回結果雜湊值,並將摘要重設為初始狀態。

# File ext/digest/lib/digest.rb, line 88
def base64digest!
  [digest!].pack('m0')
end
block_length → integer 按一下以切換來源

傳回摘要的區塊長度。

此方法會由每個實作子類別覆寫。

static VALUE
rb_digest_instance_block_length(VALUE self)
{
    rb_digest_instance_method_unimpl(self, "block_length");

    UNREACHABLE;
}
bubblebabble → hash_string 按一下以切換來源

以 Bubblebabble 編碼形式傳回結果雜湊值。

static VALUE
rb_digest_instance_bubblebabble(VALUE self)
{
    return bubblebabble_str_new(rb_funcall(self, id_digest, 0));
}
digest → string 按一下以切換來源
digest(string) → string

如果未提供任何值,傳回雜湊的結果雜湊值,並保留雜湊狀態。

如果提供 字串,傳回給定 字串 的雜湊值,並在處理前後將雜湊重設為初始狀態。

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;
}
digest! → string 按一下以切換來源

傳回結果雜湊值,並將摘要重設為初始狀態。

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_length → integer 按一下以切換來源

傳回雜湊的雜湊值的長度。

此方法應由每個實作子類別覆寫。如果沒有覆寫,則傳回 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(name) 按一下以切換來源

使用給定檔案 name 的內容更新雜湊,並傳回 self。

# 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
hexdigest → string 按一下以切換來源
hexdigest(string) → string

如果未提供任何值,傳回雜湊的結果雜湊值,並採用十六進位編碼形式,並保留雜湊狀態。

如果提供 字串,傳回給定 字串 的雜湊值,並採用十六進位編碼形式,並在處理前後將雜湊重設為初始狀態。

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);
}
hexdigest! → string 按一下以切換來源

傳回結果雜湊值,並採用十六進位編碼形式,並將雜湊重設為初始狀態。

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);
}
inspect → string 按一下以切換來源

建立雜湊物件的可列印版本。

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;
}
length → integer 按一下以切換來源

傳回 digest_obj.digest_length()。

static VALUE
rb_digest_instance_length(VALUE self)
{
    return rb_funcall(self, id_digest_length, 0);
}
別名為: size
new → another_digest_obj 按一下以切換來源

傳回雜湊物件的新初始化副本。等同於 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;
}
reset → digest_obj 按一下以切換來源

將雜湊重設為初始狀態,並傳回 self。

此方法會由每個實作子類別覆寫。

static VALUE
rb_digest_instance_reset(VALUE self)
{
    rb_digest_instance_method_unimpl(self, "reset");

    UNREACHABLE;
}
size → integer

傳回 digest_obj.digest_length()。

別名:length
to_s → string 按一下以切換來源

傳回 digest_obj.hexdigest()。

static VALUE
rb_digest_instance_to_s(VALUE self)
{
    return rb_funcall(self, id_hexdigest, 0);
}
update(string) → digest_obj 按一下以切換來源

使用指定的 *字串* 更新摘要,並傳回自身。

update() 方法和左移運算子會由各實作子類別覆寫。(其中一個應該是另一個的別名)

static VALUE
rb_digest_instance_update(VALUE self, VALUE str)
{
    rb_digest_instance_method_unimpl(self, "update");

    UNREACHABLE;
}
別名:<<

私人實例方法

instance_eval { finish } → digest_obj 按一下以切換來源

完成摘要並傳回結果雜湊值。

這個方法會被每個實作子類別覆寫,而且通常會設為私人,因為其中一些子類別可能會讓內部資料未初始化。請勿從外部呼叫這個方法。請改用digest!(),它會確保內部資料會因安全原因而重設。

static VALUE
rb_digest_instance_finish(VALUE self)
{
    rb_digest_instance_method_unimpl(self, "finish");

    UNREACHABLE;
}