[*] Hash WELL outputs (ABI break once again >:( )
[*] Rework/Fix WELL_NextBytes (large) improperly accounting for small buffers (this internal function is publicly visible. WELL_NextLong isn't going to save us)
This commit is contained in:
parent
62917318af
commit
616fc54531
@ -89,7 +89,7 @@ auline AuUInt32 WELL_NextLong_Unlocked(WELLRand *rand)
|
|||||||
a = rand->state[rand->index];
|
a = rand->state[rand->index];
|
||||||
rand->state[rand->index] = a ^ b ^ d ^ (a << 2) ^ (b << 18) ^ (c << 28);
|
rand->state[rand->index] = a ^ b ^ d ^ (a << 2) ^ (b << 18) ^ (c << 28);
|
||||||
ret = rand->state[rand->index];
|
ret = rand->state[rand->index];
|
||||||
return ret;
|
return AuFnv1a32Runtime(&ret, sizeof(ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -104,23 +104,25 @@ AuUInt32 WELL_NextLong(WELLRand *rand)
|
|||||||
|
|
||||||
void WELL_NextBytes(WELLRand *rand, void *in, AuUInt32 length)
|
void WELL_NextBytes(WELLRand *rand, void *in, AuUInt32 length)
|
||||||
{
|
{
|
||||||
AuUInt i;
|
AuUInt i, b;
|
||||||
AuUInt8 *base;
|
AuUInt8 *base;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
b = length / 4;
|
||||||
base = reinterpret_cast<AuUInt8 *>(in);
|
base = reinterpret_cast<AuUInt8 *>(in);
|
||||||
|
|
||||||
AU_LOCK_GUARD(rand->lock);
|
AU_LOCK_GUARD(rand->lock);
|
||||||
|
|
||||||
for (; i < length; i += 4)
|
for (; i < b; i++)
|
||||||
{
|
{
|
||||||
AuUInt32 rng = WELL_NextLong_Unlocked(rand);
|
AuUInt32 rng = WELL_NextLong_Unlocked(rand);
|
||||||
AuMemcpy(base + i, &rng, 4);
|
AuWriteU32(base, i * 4, rng);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i > length)
|
i *= 4;
|
||||||
|
|
||||||
|
if (i != length)
|
||||||
{
|
{
|
||||||
i -= 4;
|
|
||||||
AuUInt32 padRng = WELL_NextLong_Unlocked(rand);
|
AuUInt32 padRng = WELL_NextLong_Unlocked(rand);
|
||||||
AuMemcpy(base + i, &padRng, length - i);
|
AuMemcpy(base + i, &padRng, length - i);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user