Instead of artificially introducing collisions in the step value by replacing 0 with 1 (which causes the value 1 to have twice the frequency of any other value), the step value can simply be computed as an uniformly distributed value in the range [1, rehash], extremes included.
This is safe because any step value smaller than the hash modulus is co-prime with it, hence induces an orbit which includes every integer in [0, tableSize - 1]. --- render/glyph.c | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) diff --git a/render/glyph.c b/render/glyph.c index 7193d47..6ebf790 100644 --- a/render/glyph.c +++ b/render/glyph.c @@ -164,11 +164,7 @@ FindGlyphRef (GlyphHashPtr hash, break; } if (!step) - { - step = signature % hash->hashSet->rehash; - if (!step) - step = 1; - } + step = 1 + signature % hash->hashSet->rehash; elt += step; if (elt >= tableSize) elt -= tableSize; -- 1.7.1 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel