hash.c (mrb_obj_hash_code): expose hash function

This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-06-18 23:24:55 +09:00
parent d73e337442
commit 695207be68
2 changed files with 15 additions and 6 deletions
+1
View File
@@ -84,6 +84,7 @@ size_t mrb_hash_memsize(mrb_value obj);
size_t mrb_gc_mark_hash(mrb_state*, struct RHash*);
void mrb_gc_free_hash(mrb_state*, struct RHash*);
mrb_value mrb_hash_first_key(mrb_state*, mrb_value);
uint32_t mrb_obj_hash_code(mrb_state *mrb, mrb_value key);
/* irep */
struct mrb_insn_data mrb_decode_insn(const mrb_code *pc);
+14 -6
View File
@@ -310,8 +310,8 @@ h_check_modified_validate(mrb_state *mrb, struct h_check_modified *checker, stru
}
}
static uint32_t
obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h)
uint32_t
mrb_obj_hash_code(mrb_state *mrb, mrb_value key)
{
enum mrb_vtype tt = mrb_type(key);
uint32_t hash_code;
@@ -337,16 +337,24 @@ obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h)
hash_code = U32(mrb_obj_id(key));
break;
default:
H_CHECK_MODIFIED(mrb, h) {
hash_code_obj = mrb_funcall_argv(mrb, key, MRB_SYM(hash), 0, NULL);
}
hash_code_obj = mrb_funcall_argv(mrb, key, MRB_SYM(hash), 0, NULL);
hash_code = U32(tt) ^ U32(mrb_integer(hash_code_obj));
break;
}
return hash_code ^ (hash_code << 2) ^ (hash_code >> 2);
}
static uint32_t
obj_hash_code(mrb_state *mrb, mrb_value key, struct RHash *h)
{
uint32_t hash_code;
H_CHECK_MODIFIED(mrb, h) {
hash_code = mrb_obj_hash_code(mrb, key);
}
return hash_code;
}
static mrb_bool
obj_eql(mrb_state *mrb, mrb_value a, mrb_value b, struct RHash *h)
{