Example #1
0
static inline khint_t
mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
{
  enum mrb_vtype t = mrb_type(key);
  mrb_value hv;
  khint_t h;

  switch (t) {
  case MRB_TT_STRING:
    h = mrb_str_hash(mrb, key);
    break;

  case MRB_TT_TRUE:
  case MRB_TT_FALSE:
  case MRB_TT_SYMBOL:
  case MRB_TT_FIXNUM:
  case MRB_TT_FLOAT:
    h = (khint_t)mrb_obj_id(key);
    break;

  default:
    hv = mrb_funcall(mrb, key, "hash", 0);
    h = (khint_t)t ^ mrb_fixnum(hv);
    break;
  }
  return kh_int_hash_func(mrb, h);
}
Example #2
0
File: hash.c Project: cremno/mruby
static inline khint_t
mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
{
  enum mrb_vtype t = mrb_type(key);
  mrb_value hv;
  const char *p;
  mrb_int i, len;
  khint_t h;

  switch (t) {
  case MRB_TT_STRING:
    p = RSTRING_PTR(key);
    len = RSTRING_LEN(key);
    h = 0;
    for (i=0; i<len; i++) {
      h = (h << 5) - h + *p++;
    }
    return h;

  case MRB_TT_SYMBOL:
    h = (khint_t)mrb_symbol(key);
    return kh_int_hash_func(mrb, h);

  case MRB_TT_FIXNUM:
    h = (khint_t)mrb_float_id((mrb_float)mrb_fixnum(key));
    return kh_int_hash_func(mrb, h);

  case MRB_TT_FLOAT:
    h = (khint_t)mrb_float_id(mrb_float(key));
    return kh_int_hash_func(mrb, h);

  default:
    hv = mrb_funcall(mrb, key, "hash", 0);
    h = (khint_t)t ^ mrb_fixnum(hv);
    return kh_int_hash_func(mrb, h);
  }
}