mirror of
https://github.com/urbit/shrub.git
synced 2024-12-25 21:12:56 +03:00
uses u3r_mur_bytes in all other u3r_mur* functions
This commit is contained in:
parent
30c55e88ab
commit
1974eca515
@ -1711,68 +1711,17 @@ u3r_tape(u3_noun a)
|
||||
return a_y;
|
||||
}
|
||||
|
||||
/* Finalization mix for better avalanching.
|
||||
*/
|
||||
static c3_w
|
||||
_mur_fmix(c3_w h_w)
|
||||
{
|
||||
h_w ^= h_w >> 16;
|
||||
h_w *= 0x85ebca6b;
|
||||
h_w ^= h_w >> 13;
|
||||
h_w *= 0xc2b2ae35;
|
||||
h_w ^= h_w >> 16;
|
||||
|
||||
return h_w;
|
||||
}
|
||||
|
||||
/* _mur_words(): raw MurmurHash3 on raw words.
|
||||
*/
|
||||
static c3_w
|
||||
_mur_words(c3_w syd_w, const c3_w* key_w, c3_w len_w)
|
||||
{
|
||||
c3_w goc_w = syd_w;
|
||||
c3_w lig_w = 0xcc9e2d51;
|
||||
c3_w duf_w = 0x1b873593;
|
||||
c3_w i_w;
|
||||
|
||||
for ( i_w = 0; i_w < len_w; i_w++ ) {
|
||||
c3_w kop_w = key_w[i_w];
|
||||
|
||||
kop_w *= lig_w;
|
||||
kop_w = c3_rotw(15, kop_w);
|
||||
kop_w *= duf_w;
|
||||
|
||||
goc_w ^= kop_w;
|
||||
goc_w = c3_rotw(13, goc_w);
|
||||
goc_w = (goc_w * 5) + 0xe6546b64;
|
||||
}
|
||||
goc_w ^= len_w;
|
||||
goc_w = _mur_fmix(goc_w);
|
||||
|
||||
return goc_w;
|
||||
}
|
||||
|
||||
/* u3r_mur_words(): 31-bit nonzero MurmurHash3 on raw words.
|
||||
*/
|
||||
c3_w
|
||||
u3r_mur_words(const c3_w* key_w, c3_w len_w)
|
||||
{
|
||||
c3_w syd_w = 0xcafebabe;
|
||||
c3_w ham_w = 0;
|
||||
|
||||
while ( 0 == ham_w ) {
|
||||
c3_w haz_w = _mur_words(syd_w, key_w, len_w);
|
||||
ham_w = (haz_w >> 31) ^ (haz_w & 0x7fffffff);
|
||||
syd_w++;
|
||||
}
|
||||
|
||||
return ham_w;
|
||||
return u3r_mur_bytes((c3_y*)key_w, 4 * len_w);
|
||||
}
|
||||
|
||||
/* u3r_mur_bytes():
|
||||
**
|
||||
** Compute the mug of `buf`, `len`, LSW first.
|
||||
** XX temporary, reconcile with u3r_mur_words
|
||||
*/
|
||||
c3_w
|
||||
u3r_mur_bytes(const c3_y *buf_y,
|
||||
@ -1794,16 +1743,12 @@ u3r_mur_bytes(const c3_y *buf_y,
|
||||
/* u3r_mur_d():
|
||||
**
|
||||
** Compute the mug of `num`, LSW first.
|
||||
** XX rename to u3r_mur_chub
|
||||
*/
|
||||
c3_w
|
||||
u3r_mur_d(c3_d num_d)
|
||||
{
|
||||
c3_w buf_w[2];
|
||||
|
||||
buf_w[0] = (c3_w)(num_d & 0xffffffffULL);
|
||||
buf_w[1] = (c3_w)(num_d >> 32ULL);
|
||||
|
||||
return u3r_mur_words(buf_w, 2);
|
||||
return u3r_mur_bytes((c3_y*)&num_d, 8);
|
||||
}
|
||||
|
||||
/* u3r_mur_both():
|
||||
@ -1826,28 +1771,26 @@ u3r_mur(u3_noun veb)
|
||||
c3_assert(u3_none != veb);
|
||||
|
||||
if ( _(u3a_is_cat(veb)) ) {
|
||||
return u3r_mur_words(&veb, (0 == veb) ? 0 : 1);
|
||||
c3_w len_w = u3r_met(3, veb);
|
||||
return u3r_mur_bytes((c3_y*)&veb, len_w);
|
||||
}
|
||||
else {
|
||||
c3_w mur_w;
|
||||
|
||||
// u3a_noun* veb_u = u3a_to_ptr(veb);
|
||||
u3a_noun* veb_u = u3a_to_ptr(veb);
|
||||
|
||||
// if ( veb_u->mug_w ) {
|
||||
// return veb_u->mug_w;
|
||||
// }
|
||||
|
||||
if ( _(u3a_is_cell(veb)) ) {
|
||||
mur_w = u3r_mur_both(u3r_mur(u3h(veb)), u3r_mur(u3t(veb)));
|
||||
mur_w = u3r_mur_cell(u3h(veb), u3t(veb));
|
||||
}
|
||||
else {
|
||||
c3_w len_w = u3r_met(5, veb);
|
||||
c3_w* buf_w = malloc(4 * len_w);
|
||||
u3a_atom* vat_u = (u3a_atom*)veb_u;
|
||||
c3_w len_w = u3r_met(3, veb);
|
||||
|
||||
u3r_words(0, len_w, buf_w, veb);
|
||||
mur_w = u3r_mur_words(buf_w, len_w);
|
||||
|
||||
free(buf_w);
|
||||
mur_w = u3r_mur_bytes((c3_y*)vat_u->buf_w, len_w);
|
||||
}
|
||||
|
||||
// veb_u->mug_w = mur_w;
|
||||
@ -1863,20 +1806,7 @@ u3r_mur(u3_noun veb)
|
||||
c3_w
|
||||
u3r_mur_string(const c3_c *a_c)
|
||||
{
|
||||
c3_w len_w = strlen(a_c);
|
||||
c3_w wor_w = ((len_w + 3) >> 2);
|
||||
c3_w* buf_w = alloca(4 * wor_w);
|
||||
c3_w i_w;
|
||||
|
||||
for ( i_w = 0; i_w < wor_w; i_w++ ) { buf_w[i_w] = 0; }
|
||||
|
||||
for ( i_w = 0; i_w < len_w; i_w++ ) {
|
||||
c3_w inx_w = (i_w >> 2);
|
||||
c3_w byt_w = (i_w & 3);
|
||||
|
||||
buf_w[inx_w] |= (a_c[i_w] << (8 * byt_w));
|
||||
}
|
||||
return u3r_mur_words(buf_w, wor_w);
|
||||
return u3r_mur_bytes((c3_y*)a_c, strlen(a_c));
|
||||
}
|
||||
|
||||
/* u3r_mur_cell():
|
||||
|
Loading…
Reference in New Issue
Block a user