/*********************************************************************** ** PRIVATE FUNCTION: Random ** DESCRIPTION: ** Generate a pseudo-random number ** INPUTS: None ** OUTPUTS: None ** RETURN: A pseudo-random unsigned number, 32-bits wide ** SIDE EFFECTS: ** Updates random seed (a static) ** RESTRICTIONS: ** None ** MEMORY: NA ** ALGORITHM: ** Uses the current interval timer value, promoted to a 64 bit ** float as a multiplier for a static residue (which begins ** as an uninitialized variable). The result is bits [16..48) ** of the product. Seed is then updated with the return value ** promoted to a float-64. ***********************************************************************/ static PRUint32 Random(void) { PRUint32 rv; PRUint64 shift; static PRFloat64 seed = 0x58a9382; /* Just make sure it isn't 0! */ PRFloat64 random = seed * (PRFloat64)PR_IntervalNow(); LL_USHR(shift, *((PRUint64*)&random), 16); LL_L2UI(rv, shift); seed = (PRFloat64)rv; return rv; } /* Random */
/*********************************************************************** ** PRIVATE FUNCTION: Random ** DESCRIPTION: ** Generate a pseudo-random number ** INPUTS: None ** OUTPUTS: None ** RETURN: A pseudo-random unsigned number, 32-bits wide ** SIDE EFFECTS: ** Updates random seed (a static) ** RESTRICTIONS: ** None ** MEMORY: NA ** ALGORITHM: ** Uses the current interval timer value, promoted to a 64 bit ** float as a multiplier for a static residue (which begins ** as an uninitialized variable). The result is bits [16..48) ** of the product. Seed is then updated with the return value ** promoted to a float-64. ***********************************************************************/ PRUint32 HammerData::Random() { PRUint32 rv; PRUint64 shift; RCInterval now = RCInterval(RCInterval::now); PRFloat64 random = seed * (PRFloat64)((PRIntervalTime)now); LL_USHR(shift, *((PRUint64*)&random), 16); LL_L2UI(rv, shift); seed = (PRFloat64)rv; return rv; } /* HammerData::Random */
static PLDHashNumber HashKey(PLDHashTable *table, const void *key) { // xor the low 32 bits with the high 32 bits. PRTime t = *static_cast<const PRTime *>(key); PRInt64 h64, l64; LL_USHR(h64, t, 32); l64 = LL_INIT(0, 0xffffffff); LL_AND(l64, l64, t); PRInt32 h32, l32; LL_L2I(h32, h64); LL_L2I(l32, l64); return PLDHashNumber(l32 ^ h32); }