Folks, The proposed change is design.
Martin created https://github.com/quicwg/base-drafts/issues/4387, I encourage the WG to express their support or pushback on the ticket as to whether we take it on as a design issue. Cheers Lucas On behalf of the QUIC WG Chairs On Wed, Nov 18, 2020 at 6:09 AM Willy Tarreau <[email protected]> wrote: > Hi Martin, > > On Wed, Nov 18, 2020 at 10:41:13AM +1100, Martin Thomson wrote: > > The function I've been thinking of looks like this: > > > > def grease(n): > > v = 27 > > i = 1 > > while n > 0: > > v = (v << i) | (n & 1) > > i = i + 1 > > n = n >> 1 > > return v > > > > This is bit spreader, taking the bits of the random value and adding > progressively more space between each bit. > > What about: > > (35 + 35 * (i % 18) / 18) << (i / 18) - 35 > > for i in 0..1023 > > It returns progressive values from 0 to 2^62-35 following an exponential > curve, thus all encodings will be evenly spread. While it relies on a > 56-bit shift, it doesn't require more than 10 bits operations at a time, > but needs unsigned arithmetics. We can keep only the 6 higher bits set > with all the remaining ones to zero and avoid unsigned overflow by > simplifying it like this: > > (34 + 35 * (i % 18) / 18) << (i / 18) > > It only varies the upper bits. It also has the benefit of being easy to > validate by checking that the value is exactly one of these 18 values > followed by any number of zeroes: 34,35,37,39,41,43,45,47,49,51,53, > 55,57,59,61,63,65,67 (i.e. (value >> fls(value)) equals one of these). > > Just my two cents, > Willy > >
