mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
kernel.c (mrb_obj_hash): generate hash value for big-integers.
This commit is contained in:
@@ -188,6 +188,7 @@ mrb_int mrb_bint_cmp(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
void mrb_gc_free_bint(mrb_state *mrb, struct RBasic *x);
|
||||
void mrb_bint_copy(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
size_t mrb_bint_memsize(mrb_value x);
|
||||
mrb_value mrb_bint_hash(mrb_state *mrb, mrb_value x);
|
||||
#endif
|
||||
|
||||
#endif /* MRUBY_INTERNAL_H */
|
||||
|
||||
@@ -1538,3 +1538,12 @@ mrb_bint_memsize(mrb_value x)
|
||||
struct RBigint *b = RBIGINT(x);
|
||||
return b->mp.sz * sizeof(mp_limb);
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_bint_hash(mrb_state *mrb, mrb_value x)
|
||||
{
|
||||
struct RBigint *b = RBIGINT(x);
|
||||
uint32_t hash = mrb_byte_hash((uint8_t*)b->mp.p, b->mp.sz);
|
||||
hash = mrb_byte_hash_step((uint8_t*)&b->mp.sn, sizeof(b->mp.sn), hash);
|
||||
return mrb_int_value(mrb, hash);
|
||||
}
|
||||
|
||||
@@ -249,6 +249,11 @@ mrb_obj_frozen(mrb_state *mrb, mrb_value self)
|
||||
static mrb_value
|
||||
mrb_obj_hash(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
#ifdef MRB_USE_BIGINT
|
||||
if (mrb_bigint_p(self)) {
|
||||
return mrb_bint_hash(mrb, self);
|
||||
}
|
||||
#endif
|
||||
return mrb_int_value(mrb, mrb_obj_id(self));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user