RepeatedTableScramble: Constants: FuncTableSize, HashFactor, LoopFactor InArguments: FuncTable[FuncTableSize], InSeed, RepeatTimes Temporary variables: NextFunc, ScramblingFunction, HashTmp, OutSeed Loop exactly RepeatTimes, and for each loop transform the seed by calling a scrambling function (chosen from a table, where the index is based on the current value of the seed). Use this scrambled value to calculate a hash value, which in turn will be used as base for index on the table lookup in next loop. Finally we multiply the returned value with a constant factor, before it will be used in the next call to a scrambling function. More formally, NextFunc = InSeed FOR i = 1 TO RepeatTimes ScramblingFunction = FuncTable[NextFunc MODULO FuncTableSize] OutSeed = ScramblingFunction.callFunc(InSeed, ScramblingFunction.parameters) HashTmp = 0 FOR j = 0 to 3 HashTmp = HashTmp XOR ((OutSeed.byte(i) * HashFactor) MODULO 2^32) ENDFOR NextFunc = 0 FOR j = 0 to 3 NextFunc = NextFunc XOR (HashTmp.byte(i)) ENDFOR InSeed = OutSeed * LoopFactor ENDFOR RETURN OutSeed