<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Hash function shootout!</title>
		<link>http://www.allegro.cc/forums/view/512313</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 30 Jul 2005 08:00:19 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[Lately I have been looking into hash functions, as I wanted something that would distribute evenly over a power-of-two-sized table, using ASCII key values, and would be fast. <br />
<br />
Some of the common and popular hash functions I tried performed poorly, so I decided to try writing my own based on a hunch. And whaddya know, it seems to kick some butt!<br />
<br />
Below is some test code which runs a variety of tests on a bunch of hash functions and spits out some statistics and such. The functions I wrote are the hash_rand*() ones, and in particular, hash_rand2() seems to be about the best one to use. Also included are hash functions PJW, CRC, One At A Time, Super Fast Hash, and the Allegro hash function!<br />
<br />
[code]<br />
#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;time.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
<br />
#define TEST_COUNT 100000000<br />
<br />
#define TABLE_SIZE	4096<br />
#define KEY_COUNT	(TABLE_SIZE*5)<br />
#define KEY_LEN		6<br />
#define MASK		(TABLE_SIZE-1)<br />
<br />
char test[KEY_COUNT*KEY_LEN];<br />
int key_hits[TABLE_SIZE];<br />
<br />
<br />
unsigned int hash_rand(char *key, unsigned int len)<br />
{<br />
	unsigned int i, seed=0;<br />
	<br />
	for(i=0; i&lt;len; i++)<br />
	{<br />
		seed=seed&lt;&lt;2;<br />
		seed+=key[i];<br />
	}<br />
	<br />
	seed = seed * 1103515245 + 12345;<br />
	return (unsigned int)(seed&gt;&gt;16) &amp; 65535;<br />
}<br />
<br />
<br />
// ** WINNER! **<br />
unsigned int hash_rand2(char *key, unsigned int len)<br />
{<br />
	unsigned int i, seed=0;<br />
	<br />
	for(i=0; i&lt;len; i++)<br />
	{<br />
		seed=seed&lt;&lt;2;<br />
		seed+=key[i];<br />
	}<br />
	<br />
	return seed * 1103515245 + 12345;<br />
}<br />
<br />
<br />
unsigned int hash_rand3(char *key, unsigned int len)<br />
{<br />
	unsigned int i, seed=0;<br />
	<br />
	for(i=0; i&lt;len; i++)<br />
	{<br />
		seed=seed&lt;&lt;2;<br />
		seed+=key[i];<br />
	}<br />
	<br />
	return (seed+1) * 1103515245 + 12345;<br />
}<br />
<br />
<br />
unsigned int hash_rand4(char *key, unsigned int len)<br />
{<br />
	unsigned int i, seed=0;<br />
	<br />
	for(i=0; i&lt;len; i++)<br />
	{<br />
		seed+=key[i];<br />
	}<br />
	<br />
	return (seed+1) * 1103515245 + 12345;<br />
}<br />
<br />
<br />
unsigned int hash_crc(char *key, unsigned int len)<br />
{<br />
	unsigned int hash=0, i, highorder;<br />
<br />
	for (i=0; i&lt;len; ++i)<br />
	{<br />
		highorder = hash &amp; 0xf8000000;<br />
		hash = hash&lt;&lt;8;<br />
		hash ^= highorder&gt;&gt;27;<br />
		hash ^= key[i];<br />
	}<br />
	<br />
	return hash;<br />
}<br />
<br />
<br />
unsigned int hash_pjw(char *key, unsigned int len)<br />
{<br />
	unsigned int h = 0, g, i;<br />
<br />
	for(i = 0; i&lt;len; i++)<br />
	{<br />
		h = (h &lt;&lt; 4) + key[i];<br />
		if((g = h &amp; 0xf0000000)) <br />
		{<br />
			h = h ^ (g &gt;&gt; 24);<br />
			h = h ^ g;<br />
		} <br />
	}<br />
<br />
	return h;<br />
}<br />
<br />
<br />
// &quot;One At A Time&quot; hash<br />
unsigned int hash_oaat(char *key, unsigned int len)<br />
{<br />
	unsigned int hash, i;<br />
<br />
	for (hash=0, i=0; i&lt;len; ++i)<br />
	{<br />
		hash += key[i];<br />
		hash += (hash &lt;&lt; 10);<br />
		hash ^= (hash &gt;&gt; 6);<br />
	}<br />
<br />
	hash += (hash &lt;&lt; 3);<br />
	hash ^= (hash &gt;&gt; 11);<br />
	hash += (hash &lt;&lt; 15);<br />
<br />
	return hash;<br />
}<br />
<br />
<br />
#define HASH_ROTATION 3<br />
<br />
unsigned int hash_allegro(char *key, unsigned int len)<br />
{<br />
	unsigned int hash=0, i;<br />
<br />
	for (i = 0; i&lt;len; i++)<br />
	{<br />
 		hash = ((hash &gt;&gt; HASH_ROTATION) | ((hash &lt;&lt; (16 - HASH_ROTATION)) &amp; <br />
			0xffff)) ^ (int)key[i];<br />
	}<br />
<br />
	return hash;<br />
}<br />
<br />
<br />
typedef unsigned short uint16;<br />
<br />
#define get16bits(d) (*((const uint16*) (d)))<br />
<br />
unsigned int hash_superfast(char * data, unsigned int len) <br />
{<br />
	unsigned int hash = 0, tmp;<br />
	int rem;<br />
<br />
	if (len &lt;= 0 || data == NULL) return 0;<br />
<br />
	rem = len &amp; 3;<br />
	len &gt;&gt;= 2;<br />
<br />
	/* Main loop */<br />
	for (;len &gt; 0; len--)<br />
	{<br />
		hash  += get16bits (data);<br />
		tmp    = (get16bits (data+2) &lt;&lt; 11) ^ hash;<br />
		hash   = (hash &lt;&lt; 16) ^ tmp;<br />
		data  += 2*sizeof (uint16);<br />
		hash  += hash &gt;&gt; 11;<br />
	}<br />
<br />
	/* Handle end cases */<br />
	switch (rem) <br />
	{<br />
		case 3: hash += get16bits (data);<br />
				hash ^= hash &lt;&lt; 16;<br />
				hash ^= data[sizeof (uint16)] &lt;&lt; 18;<br />
				hash += hash &gt;&gt; 11;<br />
				break;<br />
		case 2: hash += get16bits (data);<br />
				hash ^= hash &lt;&lt; 11;<br />
				hash += hash &gt;&gt; 17;<br />
				break;<br />
		case 1: hash += *data;<br />
				hash ^= hash &lt;&lt; 10;<br />
				hash += hash &gt;&gt; 1;<br />
	}<br />
<br />
	/* Force &quot;avalanching&quot; of final 127 bits */<br />
	hash ^= hash &lt;&lt; 3;<br />
	hash += hash &gt;&gt; 5;<br />
	hash ^= hash &lt;&lt; 2;<br />
	hash += hash &gt;&gt; 15;<br />
	hash ^= hash &lt;&lt; 10;<br />
<br />
	return hash;<br />
}<br />
<br />
<br />
void clear_hits()<br />
{<br />
	memset(key_hits, 0, TABLE_SIZE*sizeof(int));<br />
}<br />
<br />
<br />
int get_hits(int *chain, int *unused)<br />
{<br />
	int i, collisions=0;<br />
<br />
	*chain=0;<br />
	*unused=0;<br />
<br />
	for(i=0; i&lt;TABLE_SIZE; i++)<br />
	{<br />
		if(key_hits[i]&gt;1)<br />
		{<br />
			collisions+=key_hits[i]-1;<br />
		}<br />
<br />
		if(key_hits[i]&gt;*chain)<br />
		{<br />
			*chain=key_hits[i];<br />
		}<br />
<br />
		if(!key_hits[i])<br />
		{<br />
			(*unused)++;<br />
		}<br />
	}<br />
<br />
	return collisions;<br />
}<br />
<br />
<br />
void emit(char *ptr, int len)<br />
{<br />
	int i;<br />
	<br />
	for(i=0; i&lt;len; i++)<br />
	{<br />
		putchar(*(ptr+i));<br />
	}<br />
}<br />
<br />
<br />
void show_distribution()<br />
{<br />
	int i;<br />
	int sum=0, count=0;<br />
	int tenth=0;<br />
	int total=0;<br />
<br />
	for(i=0; i&lt;TABLE_SIZE; i++)<br />
	{<br />
		sum+=key_hits[i];<br />
		total+=key_hits[i];<br />
<br />
		if(count&gt;=TABLE_SIZE/10)<br />
		{<br />
			count=0;<br />
			tenth++;<br />
			printf(&quot;%2d: %2d (%.4f)\n&quot;, tenth, sum, ((float)sum/KEY_COUNT)*100);<br />
			sum=0;<br />
		}<br />
		count++;<br />
	}<br />
}<br />
<br />
<br />
float get_variance()<br />
{<br />
	int i;<br />
	int sum=0, count=0;<br />
	int tenth=0;<br />
	int total=0;<br />
	float mean;<br />
	float variance = 0;<br />
<br />
	for(i=0; i&lt;TABLE_SIZE; i++)<br />
	{<br />
		total+=key_hits[i];<br />
		count++;<br />
	}<br />
<br />
	mean = (float)total / (float)count;<br />
<br />
	for(i=0; i&lt;TABLE_SIZE; i++)<br />
	{<br />
		float d = key_hits[i] - mean;<br />
		variance += d * d;<br />
	}<br />
	<br />
	variance /= (float)count;<br />
	<br />
	return variance;<br />
}<br />
<br />
<br />
void test_hash(char *name, unsigned int (*func)(char*, unsigned int))<br />
{<br />
	unsigned int hash, i, longest, unused;<br />
	<br />
	clear_hits();<br />
<br />
	for(i=0; i&lt;KEY_COUNT; i++)<br />
	{<br />
		hash=func(&amp;test[i*KEY_LEN], KEY_LEN);<br />
		key_hits[hash&amp;MASK]++;<br />
	}<br />
<br />
	printf(&quot;%s distribution:\n&quot;, name);<br />
	show_distribution();<br />
<br />
	printf(&quot;%s collisions: %d\n&quot;, name, get_hits(&amp;longest, &amp;unused));<br />
	printf(&quot;%s unused: %d\n&quot;, name, unused);<br />
	printf(&quot;%s longest chain: %d\n&quot;, name, longest);<br />
	printf(&quot;%s variance: %f\n&quot;, name, get_variance());<br />
}<br />
<br />
<br />
void time_hash(char *name, unsigned int (*func)(char*, unsigned int))<br />
{<br />
	unsigned int dur, i;<br />
<br />
	dur=clock();<br />
<br />
	for(i=0; i&lt;TEST_COUNT; i++)<br />
	{<br />
		func(test, KEY_LEN);<br />
	}<br />
<br />
	dur=clock()-dur;<br />
<br />
	printf(&quot;%s %d: %fs\n\n&quot;, name, TEST_COUNT, (double)dur/CLOCKS_PER_SEC);<br />
}<br />
<br />
<br />
int main()<br />
{<br />
	int i;<br />
<br />
	srand(time(NULL));<br />
<br />
	for(i=0; i&lt;KEY_COUNT*KEY_LEN; i++)<br />
	{<br />
<br />
		// printable ASCII<br />
//		test[i]=32+rand()%94;<br />
<br />
		// lowercase alphabet - PJW does worse here<br />
		test[i]=97+rand()%26;<br />
	}<br />
<br />
	printf(&quot;* Table size: %d, keys: %d\n\n&quot;, TABLE_SIZE, KEY_COUNT);<br />
<br />
<br />
	test_hash(&quot;crc&quot;, hash_crc);<br />
	time_hash(&quot;crc&quot;, hash_crc);<br />
<br />
	test_hash(&quot;pjw&quot;, hash_pjw);<br />
	time_hash(&quot;pjw&quot;, hash_pjw);<br />
<br />
	test_hash(&quot;OAAT&quot;, hash_oaat);<br />
	time_hash(&quot;OAAT&quot;, hash_oaat);<br />
<br />
	test_hash(&quot;superfast&quot;, hash_superfast);<br />
	time_hash(&quot;superfast&quot;, hash_superfast);<br />
<br />
	test_hash(&quot;allegro&quot;, hash_allegro);<br />
	time_hash(&quot;allegro&quot;, hash_allegro);<br />
<br />
	test_hash(&quot;rand&quot;, hash_rand);<br />
	time_hash(&quot;rand&quot;, hash_rand);<br />
<br />
	test_hash(&quot;rand2&quot;, hash_rand2);<br />
	time_hash(&quot;rand2&quot;, hash_rand2);<br />
<br />
	test_hash(&quot;rand3&quot;, hash_rand3);<br />
	time_hash(&quot;rand3&quot;, hash_rand3);<br />
<br />
	test_hash(&quot;rand4&quot;, hash_rand4);<br />
	time_hash(&quot;rand4&quot;, hash_rand4);<br />
<br />
	getchar();<br />
<br />
	return 0;<br />
}<br />
[/code]<br />
<br />
And here are the results on my machine (AMD Duron), compiled with MSVC 6:<br />
<br />
[code]<br />
* Table size: 4096, keys: 20480<br />
<br />
crc distribution:<br />
 1: 1532 (7.4805)<br />
 2: 790 (3.8574)<br />
 3: 2284 (11.1523)<br />
 4: 1683 (8.2178)<br />
 5: 2454 (11.9824)<br />
 6: 3143 (15.3467)<br />
 7: 1542 (7.5293)<br />
 8: 2929 (14.3018)<br />
 9: 1491 (7.2803)<br />
10: 2632 (12.8516)<br />
crc collisions: 20032<br />
crc unused: 3648<br />
crc longest chain: 82<br />
crc variance: 224.945313<br />
crc 100000000: 6.439000s<br />
<br />
pjw distribution:<br />
 1: 2399 (11.7139)<br />
 2: 1514 (7.3926)<br />
 3: 1256 (6.1328)<br />
 4: 1227 (5.9912)<br />
 5: 1542 (7.5293)<br />
 6: 2325 (11.3525)<br />
 7: 2701 (13.1885)<br />
 8: 2427 (11.8506)<br />
 9: 2381 (11.6260)<br />
10: 2683 (13.1006)<br />
pjw collisions: 16555<br />
pjw unused: 171<br />
pjw longest chain: 19<br />
pjw variance: 11.394043<br />
pjw 100000000: 7.521000s<br />
<br />
OAAT distribution:<br />
 1: 2081 (10.1611)<br />
 2: 2066 (10.0879)<br />
 3: 1986 (9.6973)<br />
 4: 1990 (9.7168)<br />
 5: 2055 (10.0342)<br />
 6: 2055 (10.0342)<br />
 7: 2098 (10.2441)<br />
 8: 1998 (9.7559)<br />
 9: 2077 (10.1416)<br />
10: 2040 (9.9609)<br />
OAAT collisions: 16411<br />
OAAT unused: 27<br />
OAAT longest chain: 15<br />
OAAT variance: 4.978516<br />
OAAT 100000000: 9.043000s<br />
<br />
superfast distribution:<br />
 1: 2067 (10.0928)<br />
 2: 1996 (9.7461)<br />
 3: 2026 (9.8926)<br />
 4: 2063 (10.0732)<br />
 5: 1979 (9.6631)<br />
 6: 2092 (10.2148)<br />
 7: 2071 (10.1123)<br />
 8: 2031 (9.9170)<br />
 9: 1996 (9.7461)<br />
10: 2136 (10.4297)<br />
superfast collisions: 16407<br />
superfast unused: 23<br />
superfast longest chain: 16<br />
superfast variance: 5.103516<br />
superfast 100000000: 6.359000s<br />
<br />
allegro distribution:<br />
 1: 1834 (8.9551)<br />
 2: 2145 (10.4736)<br />
 3: 2025 (9.8877)<br />
 4: 2034 (9.9316)<br />
 5: 2276 (11.1133)<br />
 6: 1994 (9.7363)<br />
 7: 2159 (10.5420)<br />
 8: 1983 (9.6826)<br />
 9: 1830 (8.9355)<br />
10: 2177 (10.6299)<br />
allegro collisions: 16423<br />
allegro unused: 39<br />
allegro longest chain: 14<br />
allegro variance: 5.588867<br />
allegro 100000000: 6.589000s<br />
<br />
rand distribution:<br />
 1: 2012 (9.8242)<br />
 2: 2034 (9.9316)<br />
 3: 1970 (9.6191)<br />
 4: 2053 (10.0244)<br />
 5: 2132 (10.4102)<br />
 6: 2107 (10.2881)<br />
 7: 2014 (9.8340)<br />
 8: 2024 (9.8828)<br />
 9: 2041 (9.9658)<br />
10: 2071 (10.1123)<br />
rand collisions: 16416<br />
rand unused: 32<br />
rand longest chain: 15<br />
rand variance: 5.151367<br />
rand 100000000: 4.437000s<br />
<br />
rand2 distribution:<br />
 1: 2044 (9.9805)<br />
 2: 2095 (10.2295)<br />
 3: 1966 (9.5996)<br />
 4: 2037 (9.9463)<br />
 5: 2070 (10.1074)<br />
 6: 1963 (9.5850)<br />
 7: 2080 (10.1563)<br />
 8: 2046 (9.9902)<br />
 9: 2114 (10.3223)<br />
10: 2038 (9.9512)<br />
rand2 collisions: 16428<br />
rand2 unused: 44<br />
rand2 longest chain: 16<br />
rand2 variance: 5.331055<br />
rand2 100000000: 4.446000s<br />
<br />
rand3 distribution:<br />
 1: 2086 (10.1855)<br />
 2: 1957 (9.5557)<br />
 3: 2039 (9.9561)<br />
 4: 2079 (10.1514)<br />
 5: 1965 (9.5947)<br />
 6: 2074 (10.1270)<br />
 7: 2044 (9.9805)<br />
 8: 2114 (10.3223)<br />
 9: 2042 (9.9707)<br />
10: 2048 (10.0000)<br />
rand3 collisions: 16428<br />
rand3 unused: 44<br />
rand3 longest chain: 16<br />
rand3 variance: 5.331055<br />
rand3 100000000: 4.416000s<br />
<br />
rand4 distribution:<br />
 1: 2038 (9.9512)<br />
 2: 1916 (9.3555)<br />
 3: 2008 (9.8047)<br />
 4: 2049 (10.0049)<br />
 5: 2076 (10.1367)<br />
 6: 2025 (9.8877)<br />
 7: 1948 (9.5117)<br />
 8: 2321 (11.3330)<br />
 9: 2043 (9.9756)<br />
10: 2056 (10.0391)<br />
rand4 collisions: 20357<br />
rand4 unused: 3973<br />
rand4 longest chain: 459<br />
rand4 variance: 1523.432129<br />
rand4 100000000: 4.437000s<br />
[/code]<br />
<br />
Feel free to run your own tests, pick it apart, and finally bow down to hash_rand2() as teh ultimaet hash and submit to using it in your own projects! :D ;)]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Sun, 24 Jul 2005 21:27:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s results from me, P4, compiled with -march=pentium4 -O3 with gcc 4.0, and with the key length changed from 6 to 32:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k3">*</span> Table size: <span class="n">4096</span>, keys: <span class="n">20480</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td>crc distribution:</td></tr><tr><td class="number">4</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">1603</span> <span class="k2">(</span><span class="n">7</span>.<span class="n">8271</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">796</span> <span class="k2">(</span><span class="n">3</span>.<span class="n">8867</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2123</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">3662</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">1700</span> <span class="k2">(</span><span class="n">8</span>.<span class="n">3008</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2407</span> <span class="k2">(</span><span class="n">11</span>.<span class="n">7529</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">3168</span> <span class="k2">(</span><span class="n">15</span>.<span class="n">4688</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">1572</span> <span class="k2">(</span><span class="n">7</span>.<span class="n">6758</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2940</span> <span class="k2">(</span><span class="n">14</span>.<span class="n">3555</span><span class="k2">)</span></td></tr><tr><td class="number">12</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">1431</span> <span class="k2">(</span><span class="n">6</span>.<span class="n">9873</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2740</span> <span class="k2">(</span><span class="n">13</span>.<span class="n">3789</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td>crc collisions: <span class="n">20032</span></td></tr><tr><td class="number">15</td><td>crc unused: <span class="n">3648</span></td></tr><tr><td class="number">16</td><td>crc longest chain: <span class="n">82</span></td></tr><tr><td class="number">17</td><td>crc variance: <span class="n">225</span>.<span class="n">203613</span></td></tr><tr><td class="number">18</td><td>crc <span class="n">100000000</span><span class="k2">:</span> <span class="n">6</span>.<span class="n">330000</span>s</td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>pjw distribution:</td></tr><tr><td class="number">21</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2050</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0098</span><span class="k2">)</span></td></tr><tr><td class="number">22</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2056</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0391</span><span class="k2">)</span></td></tr><tr><td class="number">23</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2032</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9219</span><span class="k2">)</span></td></tr><tr><td class="number">24</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2043</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9756</span><span class="k2">)</span></td></tr><tr><td class="number">25</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2022</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8730</span><span class="k2">)</span></td></tr><tr><td class="number">26</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2070</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1074</span><span class="k2">)</span></td></tr><tr><td class="number">27</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2056</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0391</span><span class="k2">)</span></td></tr><tr><td class="number">28</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2056</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0391</span><span class="k2">)</span></td></tr><tr><td class="number">29</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2033</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9268</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2039</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9561</span><span class="k2">)</span></td></tr><tr><td class="number">31</td><td>pjw collisions: <span class="n">16467</span></td></tr><tr><td class="number">32</td><td>pjw unused: <span class="n">83</span></td></tr><tr><td class="number">33</td><td>pjw longest chain: <span class="n">16</span></td></tr><tr><td class="number">34</td><td>pjw variance: <span class="n">7</span>.<span class="n">468262</span></td></tr><tr><td class="number">35</td><td>pjw <span class="n">100000000</span><span class="k2">:</span> <span class="n">10</span>.<span class="n">420000</span>s</td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>OAAT distribution:</td></tr><tr><td class="number">38</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2045</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9854</span><span class="k2">)</span></td></tr><tr><td class="number">39</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2076</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1367</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2047</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9951</span><span class="k2">)</span></td></tr><tr><td class="number">41</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2033</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9268</span><span class="k2">)</span></td></tr><tr><td class="number">42</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2122</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">3613</span><span class="k2">)</span></td></tr><tr><td class="number">43</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2063</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0732</span><span class="k2">)</span></td></tr><tr><td class="number">44</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2029</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9072</span><span class="k2">)</span></td></tr><tr><td class="number">45</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">1994</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7363</span><span class="k2">)</span></td></tr><tr><td class="number">46</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2041</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9658</span><span class="k2">)</span></td></tr><tr><td class="number">47</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2008</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8047</span><span class="k2">)</span></td></tr><tr><td class="number">48</td><td>OAAT collisions: <span class="n">16408</span></td></tr><tr><td class="number">49</td><td>OAAT unused: <span class="n">24</span></td></tr><tr><td class="number">50</td><td>OAAT longest chain: <span class="n">14</span></td></tr><tr><td class="number">51</td><td>OAAT variance: <span class="n">4</span>.<span class="n">930176</span></td></tr><tr><td class="number">52</td><td>OAAT <span class="n">100000000</span><span class="k2">:</span> <span class="n">9</span>.<span class="n">040000</span>s</td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td>superfast distribution:</td></tr><tr><td class="number">55</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2110</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">3027</span><span class="k2">)</span></td></tr><tr><td class="number">56</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2056</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0391</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2051</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0146</span><span class="k2">)</span></td></tr><tr><td class="number">58</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2078</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1465</span><span class="k2">)</span></td></tr><tr><td class="number">59</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2027</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8975</span><span class="k2">)</span></td></tr><tr><td class="number">60</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">1996</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7461</span><span class="k2">)</span></td></tr><tr><td class="number">61</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2039</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9561</span><span class="k2">)</span></td></tr><tr><td class="number">62</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2035</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9365</span><span class="k2">)</span></td></tr><tr><td class="number">63</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">1998</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7559</span><span class="k2">)</span></td></tr><tr><td class="number">64</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2066</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0879</span><span class="k2">)</span></td></tr><tr><td class="number">65</td><td>superfast collisions: <span class="n">16412</span></td></tr><tr><td class="number">66</td><td>superfast unused: <span class="n">28</span></td></tr><tr><td class="number">67</td><td>superfast longest chain: <span class="n">14</span></td></tr><tr><td class="number">68</td><td>superfast variance: <span class="n">5</span>.<span class="n">017090</span></td></tr><tr><td class="number">69</td><td>superfast <span class="n">100000000</span><span class="k2">:</span> <span class="n">3</span>.<span class="n">380000</span>s</td></tr><tr><td class="number">70</td><td>&#160;</td></tr><tr><td class="number">71</td><td>allegro distribution:</td></tr><tr><td class="number">72</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2019</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8584</span><span class="k2">)</span></td></tr><tr><td class="number">73</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2089</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2002</span><span class="k2">)</span></td></tr><tr><td class="number">74</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">1991</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7217</span><span class="k2">)</span></td></tr><tr><td class="number">75</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2086</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1855</span><span class="k2">)</span></td></tr><tr><td class="number">76</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2014</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8340</span><span class="k2">)</span></td></tr><tr><td class="number">77</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2153</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">5127</span><span class="k2">)</span></td></tr><tr><td class="number">78</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2009</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8096</span><span class="k2">)</span></td></tr><tr><td class="number">79</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2040</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9609</span><span class="k2">)</span></td></tr><tr><td class="number">80</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2007</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7998</span><span class="k2">)</span></td></tr><tr><td class="number">81</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2052</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0195</span><span class="k2">)</span></td></tr><tr><td class="number">82</td><td>allegro collisions: <span class="n">16415</span></td></tr><tr><td class="number">83</td><td>allegro unused: <span class="n">31</span></td></tr><tr><td class="number">84</td><td>allegro longest chain: <span class="n">17</span></td></tr><tr><td class="number">85</td><td>allegro variance: <span class="n">5</span>.<span class="n">188477</span></td></tr><tr><td class="number">86</td><td>allegro <span class="n">100000000</span><span class="k2">:</span> <span class="n">6</span>.<span class="n">980000</span>s</td></tr><tr><td class="number">87</td><td>&#160;</td></tr><tr><td class="number">88</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> distribution:</td></tr><tr><td class="number">89</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2039</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9561</span><span class="k2">)</span></td></tr><tr><td class="number">90</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2022</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8730</span><span class="k2">)</span></td></tr><tr><td class="number">91</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2029</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9072</span><span class="k2">)</span></td></tr><tr><td class="number">92</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2084</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1758</span><span class="k2">)</span></td></tr><tr><td class="number">93</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2066</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0879</span><span class="k2">)</span></td></tr><tr><td class="number">94</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2007</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7998</span><span class="k2">)</span></td></tr><tr><td class="number">95</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2010</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8145</span><span class="k2">)</span></td></tr><tr><td class="number">96</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2088</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1953</span><span class="k2">)</span></td></tr><tr><td class="number">97</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">1986</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6973</span><span class="k2">)</span></td></tr><tr><td class="number">98</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2130</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">4004</span><span class="k2">)</span></td></tr><tr><td class="number">99</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> collisions: <span class="n">16407</span></td></tr><tr><td class="number">100</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> unused: <span class="n">23</span></td></tr><tr><td class="number">101</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> longest chain: <span class="n">13</span></td></tr><tr><td class="number">102</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> variance: <span class="n">4</span>.<span class="n">880371</span></td></tr><tr><td class="number">103</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> <span class="n">100000000</span><span class="k2">:</span> <span class="n">5</span>.<span class="n">050000</span>s</td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td>rand2 distribution:</td></tr><tr><td class="number">106</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2002</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7754</span><span class="k2">)</span></td></tr><tr><td class="number">107</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2039</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9561</span><span class="k2">)</span></td></tr><tr><td class="number">108</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2060</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0586</span><span class="k2">)</span></td></tr><tr><td class="number">109</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2087</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1904</span><span class="k2">)</span></td></tr><tr><td class="number">110</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2012</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8242</span><span class="k2">)</span></td></tr><tr><td class="number">111</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">1983</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6826</span><span class="k2">)</span></td></tr><tr><td class="number">112</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2076</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1367</span><span class="k2">)</span></td></tr><tr><td class="number">113</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2064</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0781</span><span class="k2">)</span></td></tr><tr><td class="number">114</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2081</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1611</span><span class="k2">)</span></td></tr><tr><td class="number">115</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2051</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0146</span><span class="k2">)</span></td></tr><tr><td class="number">116</td><td>rand2 collisions: <span class="n">16415</span></td></tr><tr><td class="number">117</td><td>rand2 unused: <span class="n">31</span></td></tr><tr><td class="number">118</td><td>rand2 longest chain: <span class="n">15</span></td></tr><tr><td class="number">119</td><td>rand2 variance: <span class="n">5</span>.<span class="n">338379</span></td></tr><tr><td class="number">120</td><td>rand2 <span class="n">100000000</span><span class="k2">:</span> <span class="n">5</span>.<span class="n">110000</span>s</td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>rand3 distribution:</td></tr><tr><td class="number">123</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2046</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9902</span><span class="k2">)</span></td></tr><tr><td class="number">124</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2062</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0684</span><span class="k2">)</span></td></tr><tr><td class="number">125</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2073</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1221</span><span class="k2">)</span></td></tr><tr><td class="number">126</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2025</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8877</span><span class="k2">)</span></td></tr><tr><td class="number">127</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">1987</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7021</span><span class="k2">)</span></td></tr><tr><td class="number">128</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2068</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0977</span><span class="k2">)</span></td></tr><tr><td class="number">129</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2063</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0732</span><span class="k2">)</span></td></tr><tr><td class="number">130</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2077</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1416</span><span class="k2">)</span></td></tr><tr><td class="number">131</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2068</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0977</span><span class="k2">)</span></td></tr><tr><td class="number">132</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">1988</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7070</span><span class="k2">)</span></td></tr><tr><td class="number">133</td><td>rand3 collisions: <span class="n">16415</span></td></tr><tr><td class="number">134</td><td>rand3 unused: <span class="n">31</span></td></tr><tr><td class="number">135</td><td>rand3 longest chain: <span class="n">15</span></td></tr><tr><td class="number">136</td><td>rand3 variance: <span class="n">5</span>.<span class="n">338379</span></td></tr><tr><td class="number">137</td><td>rand3 <span class="n">100000000</span><span class="k2">:</span> <span class="n">5</span>.<span class="n">170000</span>s</td></tr><tr><td class="number">138</td><td>&#160;</td></tr><tr><td class="number">139</td><td>rand4 distribution:</td></tr><tr><td class="number">140</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2006</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7949</span><span class="k2">)</span></td></tr><tr><td class="number">141</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2020</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8633</span><span class="k2">)</span></td></tr><tr><td class="number">142</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">1995</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7412</span><span class="k2">)</span></td></tr><tr><td class="number">143</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2003</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7803</span><span class="k2">)</span></td></tr><tr><td class="number">144</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2030</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9121</span><span class="k2">)</span></td></tr><tr><td class="number">145</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2078</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1465</span><span class="k2">)</span></td></tr><tr><td class="number">146</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">1967</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6045</span><span class="k2">)</span></td></tr><tr><td class="number">147</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2019</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8584</span><span class="k2">)</span></td></tr><tr><td class="number">148</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2149</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">4932</span><span class="k2">)</span></td></tr><tr><td class="number">149</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2092</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2148</span><span class="k2">)</span></td></tr><tr><td class="number">150</td><td>rand4 collisions: <span class="n">20202</span></td></tr><tr><td class="number">151</td><td>rand4 unused: <span class="n">3818</span></td></tr><tr><td class="number">152</td><td>rand4 longest chain: <span class="n">223</span></td></tr><tr><td class="number">153</td><td>rand4 variance: <span class="n">664</span>.<span class="n">569824</span></td></tr><tr><td class="number">154</td><td>rand4 <span class="n">100000000</span><span class="k2">:</span> <span class="n">5</span>.<span class="n">670000</span>s</td></tr></tbody></table></div></div><p>

superfast now outperforms rand2. As we talked on IRC, there may be a way to get around the byte by byte adding with rand2 though, which likely is where superfast gets an advantage with the 16bit at once adding.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sun, 24 Jul 2005 21:50:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>As you know, Elias, (since we collaborated on the function <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />) we now have hash_rand5() which apparently blows all other competition out of the water. I&#39;d like to see what the gotcha is, surely there must be something.</p><p>Here&#39;s the function:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">unsigned</span> <span class="k1">int</span> hash_rand5<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a>, <span class="k1">unsigned</span> <span class="k1">int</span> len<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">unsigned</span> <span class="k1">int</span> i, seed<span class="k3">=</span><span class="n">0</span>, rem<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>  rem <span class="k3">=</span> len <span class="k3">&amp;</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>  len&gt;&gt;<span class="k3">=</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>  <span class="k1">for</span><span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>len<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>    seed<span class="k3">=</span>seed<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>    seed<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>  <span class="k1">switch</span><span class="k2">(</span>rem<span class="k2">)</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>    <span class="k1">case</span> <span class="n">1</span><span class="k2">:</span> seed<span class="k3">=</span>seed<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="n">2</span><span class="k2">;</span> seed<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">18</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>    <span class="k1">case</span> <span class="n">2</span><span class="k2">:</span> seed<span class="k3">=</span>seed<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="n">3</span><span class="k2">;</span> seed<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">21</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>    <span class="k1">case</span> <span class="n">3</span><span class="k2">:</span> seed<span class="k3">=</span>seed<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="n">4</span><span class="k2">;</span> seed<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span><span class="k2">]</span> <span class="k3">+</span> </td></tr><tr><td class="number">24</td><td>      <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span> <span class="k3">+</span> <span class="n">2</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">25</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>  <span class="k1">return</span> seed <span class="k3">*</span> <span class="n">1103515245</span> <span class="k3">+</span> <span class="n">12345</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

And here are my results for a random lowercase alphabetic key of 63 characters:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k3">*</span> Table size: <span class="n">4096</span>, keys: <span class="n">20480</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td>crc distribution:</td></tr><tr><td class="number">4</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">1604</span> <span class="k2">(</span><span class="n">7</span>.<span class="n">8320</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">786</span> <span class="k2">(</span><span class="n">3</span>.<span class="n">8379</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2106</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2832</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">1772</span> <span class="k2">(</span><span class="n">8</span>.<span class="n">6523</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2519</span> <span class="k2">(</span><span class="n">12</span>.<span class="n">2998</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">3025</span> <span class="k2">(</span><span class="n">14</span>.<span class="n">7705</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">1609</span> <span class="k2">(</span><span class="n">7</span>.<span class="n">8564</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2917</span> <span class="k2">(</span><span class="n">14</span>.<span class="n">2432</span><span class="k2">)</span></td></tr><tr><td class="number">12</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">1434</span> <span class="k2">(</span><span class="n">7</span>.<span class="n">0020</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2708</span> <span class="k2">(</span><span class="n">13</span>.<span class="n">2227</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td>crc collisions: <span class="n">20032</span></td></tr><tr><td class="number">15</td><td>crc unused: <span class="n">3648</span></td></tr><tr><td class="number">16</td><td>crc longest chain: <span class="n">78</span></td></tr><tr><td class="number">17</td><td>crc variance: <span class="n">224</span>.<span class="n">199707</span></td></tr><tr><td class="number">18</td><td>crc <span class="n">5000000</span><span class="k2">:</span> <span class="n">2</span>.<span class="n">654000</span>s</td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>pjw distribution:</td></tr><tr><td class="number">21</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2099</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2490</span><span class="k2">)</span></td></tr><tr><td class="number">22</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2066</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0879</span><span class="k2">)</span></td></tr><tr><td class="number">23</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">1926</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">4043</span><span class="k2">)</span></td></tr><tr><td class="number">24</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2101</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2588</span><span class="k2">)</span></td></tr><tr><td class="number">25</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2009</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8096</span><span class="k2">)</span></td></tr><tr><td class="number">26</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2099</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2490</span><span class="k2">)</span></td></tr><tr><td class="number">27</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2050</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0098</span><span class="k2">)</span></td></tr><tr><td class="number">28</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2036</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9414</span><span class="k2">)</span></td></tr><tr><td class="number">29</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2049</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0049</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2036</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9414</span><span class="k2">)</span></td></tr><tr><td class="number">31</td><td>pjw collisions: <span class="n">16467</span></td></tr><tr><td class="number">32</td><td>pjw unused: <span class="n">83</span></td></tr><tr><td class="number">33</td><td>pjw longest chain: <span class="n">18</span></td></tr><tr><td class="number">34</td><td>pjw variance: <span class="n">7</span>.<span class="n">376953</span></td></tr><tr><td class="number">35</td><td>pjw <span class="n">5000000</span><span class="k2">:</span> <span class="n">4</span>.<span class="n">095000</span>s</td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>OAAT distribution:</td></tr><tr><td class="number">38</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2040</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9609</span><span class="k2">)</span></td></tr><tr><td class="number">39</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2007</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7998</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2085</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1807</span><span class="k2">)</span></td></tr><tr><td class="number">41</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2049</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0049</span><span class="k2">)</span></td></tr><tr><td class="number">42</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2076</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1367</span><span class="k2">)</span></td></tr><tr><td class="number">43</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2120</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">3516</span><span class="k2">)</span></td></tr><tr><td class="number">44</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2033</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9268</span><span class="k2">)</span></td></tr><tr><td class="number">45</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2025</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8877</span><span class="k2">)</span></td></tr><tr><td class="number">46</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2056</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0391</span><span class="k2">)</span></td></tr><tr><td class="number">47</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">1966</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">5996</span><span class="k2">)</span></td></tr><tr><td class="number">48</td><td>OAAT collisions: <span class="n">16424</span></td></tr><tr><td class="number">49</td><td>OAAT unused: <span class="n">40</span></td></tr><tr><td class="number">50</td><td>OAAT longest chain: <span class="n">14</span></td></tr><tr><td class="number">51</td><td>OAAT variance: <span class="n">5</span>.<span class="n">213379</span></td></tr><tr><td class="number">52</td><td>OAAT <span class="n">5000000</span><span class="k2">:</span> <span class="n">3</span>.<span class="n">505000</span>s</td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td>superfast distribution:</td></tr><tr><td class="number">55</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">1985</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6924</span><span class="k2">)</span></td></tr><tr><td class="number">56</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2043</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9756</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2015</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8389</span><span class="k2">)</span></td></tr><tr><td class="number">58</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2061</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0635</span><span class="k2">)</span></td></tr><tr><td class="number">59</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2019</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8584</span><span class="k2">)</span></td></tr><tr><td class="number">60</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2086</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1855</span><span class="k2">)</span></td></tr><tr><td class="number">61</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2070</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1074</span><span class="k2">)</span></td></tr><tr><td class="number">62</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2000</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7656</span><span class="k2">)</span></td></tr><tr><td class="number">63</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2040</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9609</span><span class="k2">)</span></td></tr><tr><td class="number">64</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2136</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">4297</span><span class="k2">)</span></td></tr><tr><td class="number">65</td><td>superfast collisions: <span class="n">16411</span></td></tr><tr><td class="number">66</td><td>superfast unused: <span class="n">27</span></td></tr><tr><td class="number">67</td><td>superfast longest chain: <span class="n">13</span></td></tr><tr><td class="number">68</td><td>superfast variance: <span class="n">5</span>.<span class="n">139648</span></td></tr><tr><td class="number">69</td><td>superfast <span class="n">5000000</span><span class="k2">:</span> <span class="n">1</span>.<span class="n">341000</span>s</td></tr><tr><td class="number">70</td><td>&#160;</td></tr><tr><td class="number">71</td><td>allegro distribution:</td></tr><tr><td class="number">72</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2050</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0098</span><span class="k2">)</span></td></tr><tr><td class="number">73</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2007</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7998</span><span class="k2">)</span></td></tr><tr><td class="number">74</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2047</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9951</span><span class="k2">)</span></td></tr><tr><td class="number">75</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2041</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9658</span><span class="k2">)</span></td></tr><tr><td class="number">76</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2039</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9561</span><span class="k2">)</span></td></tr><tr><td class="number">77</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">1999</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7607</span><span class="k2">)</span></td></tr><tr><td class="number">78</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2074</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1270</span><span class="k2">)</span></td></tr><tr><td class="number">79</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2026</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8926</span><span class="k2">)</span></td></tr><tr><td class="number">80</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2087</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1904</span><span class="k2">)</span></td></tr><tr><td class="number">81</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2083</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1709</span><span class="k2">)</span></td></tr><tr><td class="number">82</td><td>allegro collisions: <span class="n">16403</span></td></tr><tr><td class="number">83</td><td>allegro unused: <span class="n">19</span></td></tr><tr><td class="number">84</td><td>allegro longest chain: <span class="n">14</span></td></tr><tr><td class="number">85</td><td>allegro variance: <span class="n">4</span>.<span class="n">908203</span></td></tr><tr><td class="number">86</td><td>allegro <span class="n">5000000</span><span class="k2">:</span> <span class="n">2</span>.<span class="n">534000</span>s</td></tr><tr><td class="number">87</td><td>&#160;</td></tr><tr><td class="number">88</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> distribution:</td></tr><tr><td class="number">89</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2069</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1025</span><span class="k2">)</span></td></tr><tr><td class="number">90</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2046</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9902</span><span class="k2">)</span></td></tr><tr><td class="number">91</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2041</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9658</span><span class="k2">)</span></td></tr><tr><td class="number">92</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2055</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0342</span><span class="k2">)</span></td></tr><tr><td class="number">93</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2059</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0537</span><span class="k2">)</span></td></tr><tr><td class="number">94</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">1991</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7217</span><span class="k2">)</span></td></tr><tr><td class="number">95</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2010</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8145</span><span class="k2">)</span></td></tr><tr><td class="number">96</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2104</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2734</span><span class="k2">)</span></td></tr><tr><td class="number">97</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">1997</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7510</span><span class="k2">)</span></td></tr><tr><td class="number">98</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2080</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1563</span><span class="k2">)</span></td></tr><tr><td class="number">99</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> collisions: <span class="n">16407</span></td></tr><tr><td class="number">100</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> unused: <span class="n">23</span></td></tr><tr><td class="number">101</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> longest chain: <span class="n">13</span></td></tr><tr><td class="number">102</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> variance: <span class="n">4</span>.<span class="n">951660</span></td></tr><tr><td class="number">103</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> <span class="n">5000000</span><span class="k2">:</span> <span class="n">1</span>.<span class="n">312000</span>s</td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td>rand2 distribution:</td></tr><tr><td class="number">106</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2040</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9609</span><span class="k2">)</span></td></tr><tr><td class="number">107</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2053</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0244</span><span class="k2">)</span></td></tr><tr><td class="number">108</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2070</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1074</span><span class="k2">)</span></td></tr><tr><td class="number">109</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2019</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8584</span><span class="k2">)</span></td></tr><tr><td class="number">110</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2092</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2148</span><span class="k2">)</span></td></tr><tr><td class="number">111</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2083</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1709</span><span class="k2">)</span></td></tr><tr><td class="number">112</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2083</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1709</span><span class="k2">)</span></td></tr><tr><td class="number">113</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2013</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8291</span><span class="k2">)</span></td></tr><tr><td class="number">114</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">1970</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6191</span><span class="k2">)</span></td></tr><tr><td class="number">115</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2026</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8926</span><span class="k2">)</span></td></tr><tr><td class="number">116</td><td>rand2 collisions: <span class="n">16423</span></td></tr><tr><td class="number">117</td><td>rand2 unused: <span class="n">39</span></td></tr><tr><td class="number">118</td><td>rand2 longest chain: <span class="n">16</span></td></tr><tr><td class="number">119</td><td>rand2 variance: <span class="n">5</span>.<span class="n">242188</span></td></tr><tr><td class="number">120</td><td>rand2 <span class="n">5000000</span><span class="k2">:</span> <span class="n">1</span>.<span class="n">292000</span>s</td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>rand3 distribution:</td></tr><tr><td class="number">123</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2052</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0195</span><span class="k2">)</span></td></tr><tr><td class="number">124</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2070</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1074</span><span class="k2">)</span></td></tr><tr><td class="number">125</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2038</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9512</span><span class="k2">)</span></td></tr><tr><td class="number">126</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2078</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1465</span><span class="k2">)</span></td></tr><tr><td class="number">127</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2088</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1953</span><span class="k2">)</span></td></tr><tr><td class="number">128</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2073</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1221</span><span class="k2">)</span></td></tr><tr><td class="number">129</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2016</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8438</span><span class="k2">)</span></td></tr><tr><td class="number">130</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">1974</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6387</span><span class="k2">)</span></td></tr><tr><td class="number">131</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2018</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8535</span><span class="k2">)</span></td></tr><tr><td class="number">132</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2046</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9902</span><span class="k2">)</span></td></tr><tr><td class="number">133</td><td>rand3 collisions: <span class="n">16423</span></td></tr><tr><td class="number">134</td><td>rand3 unused: <span class="n">39</span></td></tr><tr><td class="number">135</td><td>rand3 longest chain: <span class="n">16</span></td></tr><tr><td class="number">136</td><td>rand3 variance: <span class="n">5</span>.<span class="n">242188</span></td></tr><tr><td class="number">137</td><td>rand3 <span class="n">5000000</span><span class="k2">:</span> <span class="n">1</span>.<span class="n">312000</span>s</td></tr><tr><td class="number">138</td><td>&#160;</td></tr><tr><td class="number">139</td><td>rand4 distribution:</td></tr><tr><td class="number">140</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2129</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">3955</span><span class="k2">)</span></td></tr><tr><td class="number">141</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2053</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0244</span><span class="k2">)</span></td></tr><tr><td class="number">142</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2096</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2344</span><span class="k2">)</span></td></tr><tr><td class="number">143</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2003</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7803</span><span class="k2">)</span></td></tr><tr><td class="number">144</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2027</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8975</span><span class="k2">)</span></td></tr><tr><td class="number">145</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2028</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9023</span><span class="k2">)</span></td></tr><tr><td class="number">146</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2019</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8584</span><span class="k2">)</span></td></tr><tr><td class="number">147</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">1956</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">5508</span><span class="k2">)</span></td></tr><tr><td class="number">148</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2003</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7803</span><span class="k2">)</span></td></tr><tr><td class="number">149</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2042</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9707</span><span class="k2">)</span></td></tr><tr><td class="number">150</td><td>rand4 collisions: <span class="n">20081</span></td></tr><tr><td class="number">151</td><td>rand4 unused: <span class="n">3697</span></td></tr><tr><td class="number">152</td><td>rand4 longest chain: <span class="n">150</span></td></tr><tr><td class="number">153</td><td>rand4 variance: <span class="n">461</span>.<span class="n">498535</span></td></tr><tr><td class="number">154</td><td>rand4 <span class="n">5000000</span><span class="k2">:</span> <span class="n">1</span>.<span class="n">372000</span>s</td></tr><tr><td class="number">155</td><td>&#160;</td></tr><tr><td class="number">156</td><td>rand5 distribution:</td></tr><tr><td class="number">157</td><td> <span class="n">1</span><span class="k2">:</span> <span class="n">2031</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9170</span><span class="k2">)</span></td></tr><tr><td class="number">158</td><td> <span class="n">2</span><span class="k2">:</span> <span class="n">2026</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8926</span><span class="k2">)</span></td></tr><tr><td class="number">159</td><td> <span class="n">3</span><span class="k2">:</span> <span class="n">2004</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7852</span><span class="k2">)</span></td></tr><tr><td class="number">160</td><td> <span class="n">4</span><span class="k2">:</span> <span class="n">2072</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1172</span><span class="k2">)</span></td></tr><tr><td class="number">161</td><td> <span class="n">5</span><span class="k2">:</span> <span class="n">2089</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2002</span><span class="k2">)</span></td></tr><tr><td class="number">162</td><td> <span class="n">6</span><span class="k2">:</span> <span class="n">2076</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">1367</span><span class="k2">)</span></td></tr><tr><td class="number">163</td><td> <span class="n">7</span><span class="k2">:</span> <span class="n">2064</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0781</span><span class="k2">)</span></td></tr><tr><td class="number">164</td><td> <span class="n">8</span><span class="k2">:</span> <span class="n">2062</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0684</span><span class="k2">)</span></td></tr><tr><td class="number">165</td><td> <span class="n">9</span><span class="k2">:</span> <span class="n">2008</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8047</span><span class="k2">)</span></td></tr><tr><td class="number">166</td><td><span class="n">10</span><span class="k2">:</span> <span class="n">2014</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8340</span><span class="k2">)</span></td></tr><tr><td class="number">167</td><td>rand5 collisions: <span class="n">16405</span></td></tr><tr><td class="number">168</td><td>rand5 unused: <span class="n">21</span></td></tr><tr><td class="number">169</td><td>rand5 longest chain: <span class="n">15</span></td></tr><tr><td class="number">170</td><td>rand5 variance: <span class="n">4</span>.<span class="n">972168</span></td></tr><tr><td class="number">171</td><td>rand5 <span class="n">5000000</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">581000</span>s</td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Sun, 24 Jul 2005 23:09:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Those are not good hash functions.  </p><p>hash_rand collides for strings like this pair:<br />&quot;my really long test string is super great&quot;<br />&quot;his really long test string is super great&quot;<br />The flaw exploited here is that it ignores early letters in long strings.  It also has other flaws, like this:<br />&quot;az&quot;<br />&quot;bv&quot;<br />(consecutive letters can cancel each other out easily)</p><p>hash_rand2 and hash_rand3 collide on exactly the same things as hash_rand.  </p><p>hash_rand4 is worse than the previous ones.  any reordering of letters results in the same hash.  <br />&quot;ab&quot;<br />&quot;ba&quot;</p><p>hash_rand5 has the same flaws as hash_rand 1-3, but it requires slightly longer strings:<br />&quot;his really really really REALLY long test string is super super SUPER DUPER great (yes it really is)&quot;<br />&quot;her really really really REALLY long test string is super super SUPER DUPER great (yes it really is)&quot;</p><p>or, here&#39;s an example using the other flaw mentioned for hash_rand 1-3: &quot;a???z???&quot;<br />&quot;b???v???&quot;</p><p>Also, for short strings, the latter bytes do not effect the lower bits of the results well.  For instance, the difference between &quot;abc &quot; and &quot;abc0&quot; is only in the uppermost 4 bits of the hash.  </p><p>I recommend you start by reading some on the subject...<br />Bob Jenkins has some okay stuff written on the subject: <a href="http://burtleburtle.net/bob/hash/index.html">http://burtleburtle.net/bob/hash/index.html</a><br />Knuth also wrote some on the subject, in The Art of Computer Programming, volume 3 &quot;Sorting and Searching&quot;, chapter 6.4.<br />There&#39;s probably lots more resources on the web.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Mon, 25 Jul 2005 04:34:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Once you get your string hash function going, you may want to modify my hash code to manage hash sets.</p><p><a href="http://bob.allegronetwork.com/prog/hash_map/hash_map.zip">Link</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Mon, 25 Jul 2005 04:49:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey, thanks for bursting my bubble! <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" /> </p><p>Heh, no really, that&#39;s exactly why I posted this. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> Orz, your analysis is quite helpful. I have seen Bob Jenkin&#39;s page, and in fact many of the hash functions I&#39;ve tested alongside my rand* family came from there. </p><p>I figured there were some gotchas with my functions (other than the obvious ones that my testing revealed for rand4(), which was a test case in badness), especially since they seem to perform so well for the type of cases I&#39;ll use them for (and for which the tests are a little biased).</p><p>rand5() is definitely the best up to this point, and with a bit of tweaking I&#39;m sure the early characters influence will persist. Even as it stands, I&#39;m pretty happy with the results. Nevertheless, it looks like I&#39;m starting on rand6() now... <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>Bob, thanks for posting your hash map code! It looks pretty interesting, and I&#39;ll definitely give some serious perusal and tweaking (here I was about to write a chained hash table <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />) once I get my function sorted out. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>EDIT:</p><p>orz, I&#39;ve confirmed the first two flaws stated for rand1-3 (early letters, cancelling), and the 2nd flaw mentioned for rand5 (a???z???) but have been unable to confirm the early letters flaw in rand5 using a longer string. I&#39;ve tried up to a 200 character string with only the first letter different, and I&#39;m still getting unique hashes. Can you give me a working example of this flaw?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Mon, 25 Jul 2005 06:43:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>stupid smileys make it difficult to read the second example for hash_rand5...</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>orz, I&#39;ve confirmed the first two flaws stated for rand1-3 (early letters, cancelling), and the 2nd flaw mentioned for rand5 (a???z???) but have been unable to confirm the early letters flaw in rand5 using a longer string. I&#39;ve tried up to a 200 character string with only the first letter different, and I&#39;m still getting unique hashes. Can you give me a working example of this flaw?</p></div></div><p>

Hm... strange.  The two samples (100 characters long) I posted for the early-letters flaw in rand5 both produce a hash of 1675257485 in my test.  I&#39;m using exactly the code posted in your earlier post for hash_rand5, except I added a &quot;const&quot; keyword to prevent it from objecting to taking a literal string in C++ (I pasted the code into one of my C++ projects).  This is my test code:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>str1 <span class="k3">=</span> <span class="s">"his really really really REALLY long test string is super super SUPER DUPER great (yes it really is)"</span><span class="k2">;</span>
  <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>str2 <span class="k3">=</span> <span class="s">"her really really really REALLY long test string is super super SUPER DUPER great (yes it really is)"</span><span class="k2">;</span>
  <span class="k1">int</span> len1 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>str1<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">int</span> len2 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>str2<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">int</span> h1 <span class="k3">=</span> hash_rand5<span class="k2">(</span>str1, len1<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">int</span> h2 <span class="k3">=</span> hash_rand5<span class="k2">(</span>str2, len2<span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%11d len=%2d str=\"%s\"\n"</span>, h1, len1, str1<span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%11d len=%2d str=\"%s\"\n"</span>, h2, len2, str2<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Looking at the code for hash_rand5, this should work for any two strings that have the same last 64 characters and the same (length % 4).  </p><p>Here&#39;s a suggestion for testing:<br />Generate a random string of some length.  Treat the string as a long binary number.  Loop, adding 1 to the string each time.  Hash it, use the low 16 bits of the hash as an index into one table, see if the table is lopsided after a few million calls.  Repeat, but interpret the string as a backward number, adding 1 to the last character, and carrying to the second-to-last character.  </p><p>Bob Jenkins covered most of this somewhere in his stuff, but you&#39;ve already read some of his stuff and I&#39;ve already linked him, so I&#39;ll try covering it myself: <br />In order to remove early-characters-losing-relevance, you must not progressively lose information.  In your code, you have each iteration of the loop do a &quot;seed=seed&lt;&lt;2;&quot;.  This means that the highest 2 bits of seed are lost.  Nothing uses them.  Thus, nothing more than 16 loops ago (32 bit integers, divided by 2 bits per loop) can have any effect upon the value of seed.  Here&#39;s a few alternatives:<br />1. &quot;seed = seed ^ (seed &lt;&lt; 2);&quot;<br />This fixes the early-characters problem, but it does not cause any higher bits to effect lower bits.  The addition that mixes input in also does not permit higher bits to effect lower bits.  Thus, the lower bits of seed will end up sucking.  In particular, the lowest bit will be simply the XOR of all input words lowest bits.  </p><p>2. &quot;seed = seed ^ (seed &gt;&gt; 2);&quot;<br />This fixes the early-characters problem, and the low-bits problem, but it has serious issues if the input is mixed in with simmple addition.  It means that the low bits will not spread out except through the addition, which is a very poor way to spread the influence of a bit.  It&#39;s very easy for consecutive characters to cancel each other.  </p><p>3.  &quot;seed = (seed &lt;&lt; 1) ^ (seed &gt;&gt; 2);&quot;<br />This fixes the early-characters problem, and the low-bit problem, and improves the bit-spreading issues.  It&#39;s better than all of the previous examples, and while it still suffers from many problems, it probably does okay for many real world cases.  Nearby letters can cancel each other, but it often takes relatively complex relationships to cancel.  Far apart letters can cancel, but it usually takes complex relationships between such letters to cancel.  Choosing the shift lengths is a bit of a balance.  Large shift values mean that many bits in a single iteration are dependant upon only 1 bit in the previous iteration (poor spreading), but small shifts mean that spreading doesn&#39;t add up as well across multiple iterations.  I believe that the best values pairs tend to involve a right-shift slightly larger than the left-shift if addition is used to mix in input.  I know I made some unsupported statements in there, but it&#39;s to figure out how to talk about things... I don&#39;t know words to explain some of this very well or at all, and I&#39;m not sure that such words even exist, and to do a decent job I&#39;d probably need lots of diagrams... </p><p>4.  &quot;seed = (seed &lt;&lt; 7) | (seed &gt;&gt; 25);&quot;<br />A circular shift (the shifts add up to the word size).  Faster on some hardware than the above examples.  Each bit in the output depends upon only one bit in the input, so this isn&#39;t great.  In particular, inserting 32 consecutive 0s in the input will not change the output, no matter where they&#39;re inserted.  Still, this does okay for some real-world things.  I think Knuth recommended something like this somewhere.  It&#39;s imporant that the shifts be odd, not even.  </p><p>5. &quot;seed = seed * 1103515245;&quot;<br />Mixes decently, except that the high bits of the input don&#39;t get spread out, the low bits of the output suck.  Could work well with a little extra tweaking.  Fast on modern desktops, but slow on some architectures.  </p><p>Guidelines:<br />A. (very important guideline)<br />Don&#39;t lose information.  Every bit in an intermediate state must have some effect on the next intermediate state, or you will have early-characters problems.  </p><p>B. (important guideline)<br />Every input bit should be capable of effecting any bit in the final output, depending upon context (context = other input).  In any particular context, swapping a single bit should change roughly half the output bits.  </p><p>C. (important guideline)<br />Each intermediate state bit should effect multiple bits in the next intermediate state bit, or you run the chance of things canceling out.  </p><p>D. (guideline)<br />If the state size is larger than the input chunk size, then consecutive input chunks will not be able to cancel each other (unles you screw up somehow...).  This also may make it harder for even far apart chunks to cancel each other.  </p><p>E. (my own observation/intuition/recommendation/whatever)<br />The previous two guidelines (C &amp; D) are very important if the state is small, but not so important if the state is large.  </p><p>F. (guideline)<br />Many algorithms are not effected by leading 0s at the begining of a string.  That can be handled by using the length of the string as an input in the hash.  </p><p>F. (my own observation/intuition/recommendation/whatever)<br />In general, a larger state is capable of doing a better job than a smaller state of comparable complexity.  However, very large states may have speed problems, particularly when hashing short strings.  </p><p>G. (my own observation/intuition/recommendation/whatever)<br />Multiplication is great on modern desktops &amp; servers, but very slow in embedded contexts.  Despite the nice job it does mixing bits, it still has some problems: the high bits of the result are good, but the low bits of the result aren&#39;t so good, because they are not effected by the high bits of the input.  If multiplication is used as a major factor in the algorithm, you need something else to stir around the upper bits of the input, or they will suffer compared to the lower bits.  <br />Addition mixes bits much slower (particularly if nothing else is stirring them up), but does mix them.  It has the same issues as multiplication in that the low bits of the output are uneffected by the high bits of the input.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Mon, 25 Jul 2005 09:11:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Addition mixes bits much slower</p></div></div><p>Wait, you&#39;re saying that multiplcation is faster time-wise than addition? Or did you mean addition isn&#39;t as effective as multiplication?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 25 Jul 2005 15:47:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Um, what I was trying to say is that, with multiplication, bits spread to the left very quickly on a per-multiply basis, whereas with addition, they spread to the left by maybe one bit per addition.  <br />On a per operation basis, multiply is much more effective than addition.  <br />On a per-time basis, multiply usually beats addition by a little bit on modern desktop CPUs, but is beaten by addition (by a larger margin) in some embedded contexts.  Both operations must be mixed with other operations because they only spread bits leftwards, so the rightmost bits of output and the leftmost bits of input get negleected even if there&#39;s no rightshift or other operation that moves or spreads bits rightward.  </p><p>To illustrate, here&#39;s a loop that is bad because of that:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> length<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
  seed <span class="k3">+</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k3">&lt;</span>i&gt;<span class="k2">;</span>
  <span class="c">//bad! both addition and multiplication only spread bits leftwards!</span>
  seed <span class="k3">=</span> seed <span class="k3">*</span> <span class="n">1103515245</span> <span class="k3">+</span> <span class="n">12345</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
compared to a good loop, or at least, a loop that doesn&#39;t have that flaw:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> length<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
  seed <span class="k3">+</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k3">&lt;</span>i&gt;<span class="k2">;</span>
  <span class="c">//okay: the multiply spreads bits leftwards and</span>
  <span class="c">//  the circular shift moves the bits around</span>
  seed <span class="k3">=</span> seed <span class="k3">*</span> <span class="n">1103515245</span><span class="k2">;</span>
  seed <span class="k3">=</span> <span class="k2">(</span>seed <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">17</span><span class="k2">)</span> <span class="k3">|</span> <span class="k2">(</span>seed <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">15</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

For the bad loop, the low bit of the final output is dependant ONLY upon the low bits of the input.  For the good loop, the low bit of the output can be effected by any bit of the input, though a few bits in key[length-1] may have only a minimal effect on it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Mon, 25 Jul 2005 16:57:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So how effective would something like this be?<br /><span class="source-code">seed <span class="k3">=</span> seed <span class="k3">*</span> input <span class="k3">-</span> <span class="k2">(</span>input <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 26 Jul 2005 05:55:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, here&#39;s the latest incarnation, and I think I&#39;m pretty happy with this. I haven&#39;t been able to break the distribution using any orz-like tricks, and it&#39;s still a touch faster than SuperFastHash. PLUS, it still uses the rand() functionality to avalanche at the end, thus keeping its classic rand appeal. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">unsigned</span> <span class="k1">int</span> hash_rand8<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a>, <span class="k1">unsigned</span> <span class="k1">int</span> len<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">unsigned</span> <span class="k1">int</span> i, seed<span class="k3">=</span><span class="n">0</span>, rem<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>  rem <span class="k3">=</span> len <span class="k3">&amp;</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>  len&gt;&gt;<span class="k3">=</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>  <span class="k1">for</span><span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>len<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>    seed ^<span class="k3">=</span> seed <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">13</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>    seed <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>    seed ^<span class="k3">=</span> seed <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">7</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>  <span class="k1">switch</span><span class="k2">(</span>rem<span class="k2">)</span></td></tr><tr><td class="number">17</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>    <span class="k1">case</span> <span class="n">1</span><span class="k2">:</span> </td></tr><tr><td class="number">19</td><td>      seed ^<span class="k3">=</span> seed <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>      seed <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">21</td><td>      seed ^<span class="k3">=</span> seed <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">23</span><span class="k2">;</span> </td></tr><tr><td class="number">22</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>    <span class="k1">case</span> <span class="n">2</span><span class="k2">:</span> </td></tr><tr><td class="number">25</td><td>      seed ^<span class="k3">=</span> seed <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">14</span><span class="k2">;</span> </td></tr><tr><td class="number">26</td><td>      seed <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">27</td><td>      seed ^<span class="k3">=</span> seed <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">9</span><span class="k2">;</span> </td></tr><tr><td class="number">28</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>    <span class="k1">case</span> <span class="n">3</span><span class="k2">:</span> </td></tr><tr><td class="number">31</td><td>      seed ^<span class="k3">=</span> seed <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">19</span><span class="k2">;</span> </td></tr><tr><td class="number">32</td><td>      seed <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">1</span><span class="k2">]</span> <span class="k3">+</span> </td></tr><tr><td class="number">33</td><td>        <span class="k2">(</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">)</span><span class="k2">[</span>i <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">2</span> <span class="k3">+</span> <span class="n">2</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">34</td><td>      seed ^<span class="k3">=</span> seed <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">7</span><span class="k2">;</span> </td></tr><tr><td class="number">35</td><td>      <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>  <span class="k1">return</span> seed <span class="k3">*</span> <span class="n">1103515245</span> <span class="k3">+</span> <span class="n">12345</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Tue, 26 Jul 2005 06:38:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Paul Pridham:<br />The only issues that I see are in the &quot;case 3:&quot; code path, where you add input chunks without doing anything else to them, which would make these strings equivalent: &quot;a b&quot;, &quot;b a&quot;, except for the other issue: you omit parenthesis on the &quot;i &lt;&lt; 2 + 2&quot;, which is a no-no, because bitwise operators have counter-intuitive precedence in C, and that ends up meaning &quot;i &lt;&lt; 4&quot;.  <br />Asside from that it looks like it ought to be a nice hash function for use in a project, but widespread deployment would be hampered by its lack of portability.  The portability issues are endianness and alignment.  Both could be solved by reading 1 character at a time, though that hurts performance.  Notice how Bob Jenkins did it in his hash function, where he reads 1 character at a time, but combines them before hashing so that he can still hash them 32 bits at a time.  Specifically, the endianness issue is that the result of casting an array of chars to an array of shorts or ints is dependant upon platform byte order (x86, ARM, and ALPHA will get one result, MIPS, Sparc, and 68k will get a different result, PPC will usually give the MIPS/Sparc/68k result but doesn&#39;t always do so), where on x86 (*(const short*)&quot;ab&quot;) is (&#39;a&#39; + 256 * &#39;b&#39;), and on MIPS it&#39;s (&#39;a&#39; * 256 + &#39;b&#39;).  The alignment issue is that on x86, if the key pointer value is not a multiple of sizeof(int) (or whatever the pointer is cast to), then there will be a moderate performance hit, on other platforms except ARM there will be a large performance hit, and on ARM it will run faster than x86 but produce bizarre incorrect values <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />.  Alignment issues are avoid by reading data as chars, or by using #ifdefs to detect the platform at compile time and handle it appropriately.  <br />You might consider finding or creating some better tests for hash functions, so that you can make an informed comparison to other high-speed hash functions.  I can probably come up with a few tests by adapting some of my random number generation tests... I don&#39;t know if there&#39;s any kind of standard tests for hash functions though.  </p><p>CGamesPlay:<br />That has problems.  It has the leftward-only issue (high bits of seed don&#39;t spread out), and it adds loss-of-state issues when input is not an odd number.  </p><p>Subtraction does not fix the leftward-only issue - it is basically the same as addition, a leftwards only operation, and it mixes at the same rate.  (&quot;a -= b;&quot; is generally equivalent to &quot;a += 1 + ~b;&quot;, and ~ neither moves nor mixes bits)</p><p>Really, the only operations I can think of that you can get rightward movement or mixing out of are right-shift, circular shift (implemented with right-shift in C some many assembly languages), carry-based-things (in C often implemented with rightshift, though in assembly often dedicated opcodes are used, like ADC (add-with-carry)), indirection / table lookups (if the word size is large or the array size is small this may need to get combined with a right-shift to get the high bits of the input to be mixed in), modulo (which is too slow, and should generally not be used with an even modulus), modulo-based things (which range from too slow to way way way too slow), high-word-of-multiplication (which, in C, is generally implemented with floating point values or with right-shifts).  <br />In sum, if it doesn&#39;t have a right-shift in it, it has to do something weird to compensate, or else it suffers from leftwards-only bit mixing.  Many random number generators, including the libc one and the one in allegro suffer from leftwards only bit mixing problems (even Bob Jenkins ISAAC generator has some limited leftward-mixing issues when compiled with very small array sizes).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Tue, 26 Jul 2005 07:35:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>orz, ahh... can&#39;t believe I overlooked that case. Well anyway, here are three different versions now. One, rand0, mixes every byte, rand8 is as before with the case 3 fix, and rand9 follows your (and Bob Jenkins&#39;) lead and assembles 4 bytes before mixing them all together.</p><p>&lt;code&gt;<br />unsigned int hash_rand8(char *key, unsigned int len)<br />{<br />	unsigned int i, seed=0, rem;</p><p>	rem = len &amp; 3;</p><p>	len&gt;&gt;=2;</p><p>	for(i=0; i&lt;len; i++)<br />	{<br />		seed ^= seed &lt;&lt; 13;<br />		seed += ((unsigned int*)key)&lt;i&gt;;<br />		seed ^= seed &gt;&gt; 7;<br />	}</p><p>	switch(rem)<br />	{<br />		case 1: <br />			seed ^= seed &lt;&lt; 2;<br />			seed += ((unsigned char*)key)[i &lt;&lt; 2]; <br />			seed ^= seed &gt;&gt; 23; <br />			break;</p><p>		case 2: <br />			seed ^= seed &lt;&lt; 14; <br />			seed += ((unsigned short *)key)[i &lt;&lt; 1]; <br />			seed ^= seed &gt;&gt; 9; <br />			break;</p><p>		case 3: <br />			seed ^= seed &lt;&lt; 19; <br />			seed += (((unsigned short *)key)[i &lt;&lt; 1] &lt;&lt; 8 ) + <br />				((unsigned char*)key)[(i &lt;&lt; 2) + 2]; <br />			seed ^= seed &gt;&gt; 7; <br />			break;<br />	}</p><p>	return seed * 1103515245 + 12345;<br />}</p><p>unsigned int hash_rand9(char *key, unsigned int len)<br />{<br />	unsigned int i, seed=0, rem;</p><p>	rem = len &amp; 3;</p><p>	len&gt;&gt;=2;</p><p>	for(i=0; i&lt;len; i++)<br />	{<br />		seed ^= seed &lt;&lt; 13;</p><p>		seed += key[0];<br />		seed += key[1]&lt;&lt;8;<br />		seed += key[2]&lt;&lt;16;<br />		seed += key[3]&lt;&lt;24;</p><p>		seed ^= seed &gt;&gt; 7;</p><p>		key+=4;<br />	}</p><p>	switch(rem)<br />	{<br />		case 1: <br />			seed ^= seed &lt;&lt; 2;<br />			seed += key[0]; <br />			seed ^= seed &gt;&gt; 23; <br />			break;</p><p>		case 2: <br />			seed ^= seed &lt;&lt; 14; <br />			seed += key[0]; <br />			seed += key[1]&lt;&lt;8; <br />			seed ^= seed &gt;&gt; 9; <br />			break;</p><p>		case 3: <br />			seed ^= seed &lt;&lt; 19; <br />			seed += key[0]; <br />			seed += key[1]&lt;&lt;8; <br />			seed += key[2]&lt;&lt;16; <br />			seed ^= seed &gt;&gt; 7; <br />			break;<br />	}</p><p>	return seed * 1103515245 + 12345;<br />}</p><p>unsigned int hash_rand0(char *key, unsigned int len)<br />{<br />	unsigned int i, seed=0;<br />	<br />	for(i=0; i&lt;len; i++)<br />	{<br />		seed ^= seed &lt;&lt; 13;<br />		seed += key&lt;i&gt;;<br />		seed ^= seed &gt;&gt; 7;<br />	}<br />	<br />	return seed * 1103515245 + 12345;<br />}<br />&lt;code&gt;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Tue, 26 Jul 2005 19:52:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It all generally looks correct now.  </p><p>The most incorrect looking things left are that they int is assumed to be a 32 bit type, and (in hash_rand9 only), and char is assumed to get promoted to int when leftshifted.  Both of those assumptions are true on most CPUs &amp; compilers these days, but in embedded contexts you can still find some that don&#39;t follow those assumptions.  int size can be handled with a typedef or #define, promotion assumptions can be handled by explicit typecasting (as Bob Jenkins does in his hash function).  </p><p>Also, you have the case set up so that hash_rand8 and hash_rand9 produce different results right now (in the switch statement at the end, on case 3).  It might be preferable if they produced identical results (at least on little-endian machines), so that one could be a drop in replacement for the other or something.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Wed, 27 Jul 2005 04:10:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Have you a specific use for your hash functions? As choosing the fastest might not necessarily be the best.</p><p>Neil.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 27 Jul 2005 04:22:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>orz, again some good insight -- you&#039;ve been very helpful. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> I&#039;ve made the recommended changes.</p><p>Neil, I have a few different use for my functions, and not all of them will need the runtime speed. Ie. loading bitmaps, samples etc. into named entries of a hash table for configuration purposes. The resources will then be used to fill in the various data structures that will be used at runtime, such as animation sequences, scripts, sound sequences. The speed isn&#039;t needed here because the resulting data structures will directly address the various resources. However, having named items accessible to scripts/configuration is nice.</p><p>For speedier applications, the hash functions will be used as part of my scripting system to speed up dictionary accesses. Also, they will provide a means to support a fast associative array scripting datatype, as in Lua or other prototyped OO languages.</p><p>As you can see, the latter can be used to support the former as well. There are a ton of uses I&#039;ll put the functions to work in, to be sure.</p><p>Anyway, the final results are in... hash_rand8 &gt; superfasthash! The key sequence I used for this test was as follows:</p><p>XXXXXsuper really really really really really REALLY long test string is super super super super SUPER DUPER super SUPER DUPER super SUPER DUPER great (yes it really is!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)</p><p>...where XXXXX is a hex count from 00000 to 50000. This key really trashed the lesser hash functions, as you can see from the results below. The previous tests used a much smaller (20480 entries) table of 61-byte-long, randomized, lowercase alphabetical keys which seemed to improve hashing ability all around. No longer. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="k3">*</span> Table size: <span class="n">65536</span>, keys: <span class="n">327680</span>
<span class="number">   2</span>
<span class="number">   3</span>crc distribution:
<span class="number">   4</span> <span class="n">1</span><span class="k2">:</span> <span class="n">327680</span> <span class="k2">(</span><span class="n">100</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">   5</span> <span class="n">2</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">   6</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">   7</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">   8</span> <span class="n">5</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">   9</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  10</span> <span class="n">7</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  11</span> <span class="n">8</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  12</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  13</span><span class="n">10</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  14</span>crc collisions: <span class="n">327679</span>
<span class="number">  15</span>crc unused: <span class="n">65535</span>
<span class="number">  16</span>crc longest chain: <span class="n">327680</span>
<span class="number">  17</span>crc variance: <span class="n">1638375</span>.<span class="n">000000</span>
<span class="number">  18</span>crc <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">661000</span>s
<span class="number">  19</span>
<span class="number">  20</span>pjw distribution:
<span class="number">  21</span> <span class="n">1</span><span class="k2">:</span> <span class="n">137280</span> <span class="k2">(</span><span class="n">41</span>.<span class="n">8945</span><span class="k2">)</span>
<span class="number">  22</span> <span class="n">2</span><span class="k2">:</span> <span class="n">126678</span> <span class="k2">(</span><span class="n">38</span>.<span class="n">6591</span><span class="k2">)</span>
<span class="number">  23</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  24</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  25</span> <span class="n">5</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  26</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  27</span> <span class="n">7</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  28</span> <span class="n">8</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  29</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  30</span><span class="n">10</span><span class="k2">:</span> <span class="n">63722</span> <span class="k2">(</span><span class="n">19</span>.<span class="n">4464</span><span class="k2">)</span>
<span class="number">  31</span>pjw collisions: <span class="n">327531</span>
<span class="number">  32</span>pjw unused: <span class="n">65387</span>
<span class="number">  33</span>pjw longest chain: <span class="n">8176</span>
<span class="number">  34</span>pjw variance: <span class="n">21188</span>.<span class="n">374908</span>
<span class="number">  35</span>pjw <span class="n">327680</span><span class="k2">:</span> <span class="n">1</span>.<span class="n">102000</span>s
<span class="number">  36</span>
<span class="number">  37</span>OAAT distribution:
<span class="number">  38</span> <span class="n">1</span><span class="k2">:</span> <span class="n">32737</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9905</span><span class="k2">)</span>
<span class="number">  39</span> <span class="n">2</span><span class="k2">:</span> <span class="n">32965</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0601</span><span class="k2">)</span>
<span class="number">  40</span> <span class="n">3</span><span class="k2">:</span> <span class="n">32675</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9716</span><span class="k2">)</span>
<span class="number">  41</span> <span class="n">4</span><span class="k2">:</span> <span class="n">32709</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9820</span><span class="k2">)</span>
<span class="number">  42</span> <span class="n">5</span><span class="k2">:</span> <span class="n">32382</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8822</span><span class="k2">)</span>
<span class="number">  43</span> <span class="n">6</span><span class="k2">:</span> <span class="n">32999</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0705</span><span class="k2">)</span>
<span class="number">  44</span> <span class="n">7</span><span class="k2">:</span> <span class="n">32835</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0204</span><span class="k2">)</span>
<span class="number">  45</span> <span class="n">8</span><span class="k2">:</span> <span class="n">32575</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9411</span><span class="k2">)</span>
<span class="number">  46</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32909</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0430</span><span class="k2">)</span>
<span class="number">  47</span><span class="n">10</span><span class="k2">:</span> <span class="n">32872</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0317</span><span class="k2">)</span>
<span class="number">  48</span>OAAT collisions: <span class="n">262603</span>
<span class="number">  49</span>OAAT unused: <span class="n">459</span>
<span class="number">  50</span>OAAT longest chain: <span class="n">18</span>
<span class="number">  51</span>OAAT variance: <span class="n">4</span>.<span class="n">988373</span>
<span class="number">  52</span>OAAT <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">971000</span>s
<span class="number">  53</span>
<span class="number">  54</span>superfast distribution:
<span class="number">  55</span> <span class="n">1</span><span class="k2">:</span> <span class="n">32778</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0031</span><span class="k2">)</span>
<span class="number">  56</span> <span class="n">2</span><span class="k2">:</span> <span class="n">32636</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9597</span><span class="k2">)</span>
<span class="number">  57</span> <span class="n">3</span><span class="k2">:</span> <span class="n">32784</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0049</span><span class="k2">)</span>
<span class="number">  58</span> <span class="n">4</span><span class="k2">:</span> <span class="n">32966</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0604</span><span class="k2">)</span>
<span class="number">  59</span> <span class="n">5</span><span class="k2">:</span> <span class="n">32757</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9966</span><span class="k2">)</span>
<span class="number">  60</span> <span class="n">6</span><span class="k2">:</span> <span class="n">32617</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9539</span><span class="k2">)</span>
<span class="number">  61</span> <span class="n">7</span><span class="k2">:</span> <span class="n">32832</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0195</span><span class="k2">)</span>
<span class="number">  62</span> <span class="n">8</span><span class="k2">:</span> <span class="n">32907</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0424</span><span class="k2">)</span>
<span class="number">  63</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32545</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9319</span><span class="k2">)</span>
<span class="number">  64</span><span class="n">10</span><span class="k2">:</span> <span class="n">32837</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0211</span><span class="k2">)</span>
<span class="number">  65</span>superfast collisions: <span class="n">262567</span>
<span class="number">  66</span>superfast unused: <span class="n">423</span>
<span class="number">  67</span>superfast longest chain: <span class="n">16</span>
<span class="number">  68</span>superfast variance: <span class="n">5</span>.<span class="n">011139</span>
<span class="number">  69</span>superfast <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">511000</span>s
<span class="number">  70</span>
<span class="number">  71</span>allegro distribution:
<span class="number">  72</span> <span class="n">1</span><span class="k2">:</span> <span class="n">25512</span> <span class="k2">(</span><span class="n">7</span>.<span class="n">7856</span><span class="k2">)</span>
<span class="number">  73</span> <span class="n">2</span><span class="k2">:</span> <span class="n">35930</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">9650</span><span class="k2">)</span>
<span class="number">  74</span> <span class="n">3</span><span class="k2">:</span> <span class="n">33438</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2045</span><span class="k2">)</span>
<span class="number">  75</span> <span class="n">4</span><span class="k2">:</span> <span class="n">30797</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">3985</span><span class="k2">)</span>
<span class="number">  76</span> <span class="n">5</span><span class="k2">:</span> <span class="n">33029</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0797</span><span class="k2">)</span>
<span class="number">  77</span> <span class="n">6</span><span class="k2">:</span> <span class="n">28070</span> <span class="k2">(</span><span class="n">8</span>.<span class="n">5663</span><span class="k2">)</span>
<span class="number">  78</span> <span class="n">7</span><span class="k2">:</span> <span class="n">38488</span> <span class="k2">(</span><span class="n">11</span>.<span class="n">7456</span><span class="k2">)</span>
<span class="number">  79</span> <span class="n">8</span><span class="k2">:</span> <span class="n">33444</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">2063</span><span class="k2">)</span>
<span class="number">  80</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32694</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9774</span><span class="k2">)</span>
<span class="number">  81</span><span class="n">10</span><span class="k2">:</span> <span class="n">36242</span> <span class="k2">(</span><span class="n">11</span>.<span class="n">0602</span><span class="k2">)</span>
<span class="number">  82</span>allegro collisions: <span class="n">262972</span>
<span class="number">  83</span>allegro unused: <span class="n">828</span>
<span class="number">  84</span>allegro longest chain: <span class="n">29</span>
<span class="number">  85</span>allegro variance: <span class="n">12</span>.<span class="n">391602</span>
<span class="number">  86</span>allegro <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">701000</span>s
<span class="number">  87</span>
<span class="number">  88</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> distribution:
<span class="number">  89</span> <span class="n">1</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  90</span> <span class="n">2</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  91</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  92</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  93</span> <span class="n">5</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  94</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  95</span> <span class="n">7</span><span class="k2">:</span> <span class="n">327680</span> <span class="k2">(</span><span class="n">100</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  96</span> <span class="n">8</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  97</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  98</span><span class="n">10</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number">  99</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> collisions: <span class="n">327679</span>
<span class="number"> 100</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> unused: <span class="n">65535</span>
<span class="number"> 101</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> longest chain: <span class="n">327680</span>
<span class="number"> 102</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> variance: <span class="n">1638375</span>.<span class="n">000000</span>
<span class="number"> 103</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">431000</span>s
<span class="number"> 104</span>
<span class="number"> 105</span>rand2 distribution:
<span class="number"> 106</span> <span class="n">1</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 107</span> <span class="n">2</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 108</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 109</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 110</span> <span class="n">5</span><span class="k2">:</span> <span class="n">327680</span> <span class="k2">(</span><span class="n">100</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 111</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 112</span> <span class="n">7</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 113</span> <span class="n">8</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 114</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 115</span><span class="n">10</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 116</span>rand2 collisions: <span class="n">327679</span>
<span class="number"> 117</span>rand2 unused: <span class="n">65535</span>
<span class="number"> 118</span>rand2 longest chain: <span class="n">327680</span>
<span class="number"> 119</span>rand2 variance: <span class="n">1638375</span>.<span class="n">000000</span>
<span class="number"> 120</span>rand2 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">420000</span>s
<span class="number"> 121</span>
<span class="number"> 122</span>rand3 distribution:
<span class="number"> 123</span> <span class="n">1</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 124</span> <span class="n">2</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 125</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 126</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 127</span> <span class="n">5</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 128</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 129</span> <span class="n">7</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 130</span> <span class="n">8</span><span class="k2">:</span> <span class="n">327680</span> <span class="k2">(</span><span class="n">100</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 131</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 132</span><span class="n">10</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 133</span>rand3 collisions: <span class="n">327679</span>
<span class="number"> 134</span>rand3 unused: <span class="n">65535</span>
<span class="number"> 135</span>rand3 longest chain: <span class="n">327680</span>
<span class="number"> 136</span>rand3 variance: <span class="n">1638375</span>.<span class="n">000000</span>
<span class="number"> 137</span>rand3 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">431000</span>s
<span class="number"> 138</span>
<span class="number"> 139</span>rand4 distribution:
<span class="number"> 140</span> <span class="n">1</span><span class="k2">:</span> <span class="n">27634</span> <span class="k2">(</span><span class="n">8</span>.<span class="n">4332</span><span class="k2">)</span>
<span class="number"> 141</span> <span class="n">2</span><span class="k2">:</span> <span class="n">33016</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0757</span><span class="k2">)</span>
<span class="number"> 142</span> <span class="n">3</span><span class="k2">:</span> <span class="n">35497</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">8328</span><span class="k2">)</span>
<span class="number"> 143</span> <span class="n">4</span><span class="k2">:</span> <span class="n">31958</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">7528</span><span class="k2">)</span>
<span class="number"> 144</span> <span class="n">5</span><span class="k2">:</span> <span class="n">30218</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">2218</span><span class="k2">)</span>
<span class="number"> 145</span> <span class="n">6</span><span class="k2">:</span> <span class="n">37200</span> <span class="k2">(</span><span class="n">11</span>.<span class="n">3525</span><span class="k2">)</span>
<span class="number"> 146</span> <span class="n">7</span><span class="k2">:</span> <span class="n">31731</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">6835</span><span class="k2">)</span>
<span class="number"> 147</span> <span class="n">8</span><span class="k2">:</span> <span class="n">28857</span> <span class="k2">(</span><span class="n">8</span>.<span class="n">8065</span><span class="k2">)</span>
<span class="number"> 148</span> <span class="n">9</span><span class="k2">:</span> <span class="n">34354</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">4840</span><span class="k2">)</span>
<span class="number"> 149</span><span class="n">10</span><span class="k2">:</span> <span class="n">37215</span> <span class="k2">(</span><span class="n">11</span>.<span class="n">3571</span><span class="k2">)</span>
<span class="number"> 150</span>rand4 collisions: <span class="n">327515</span>
<span class="number"> 151</span>rand4 unused: <span class="n">65371</span>
<span class="number"> 152</span>rand4 longest chain: <span class="n">8440</span>
<span class="number"> 153</span>rand4 variance: <span class="n">24737</span>.<span class="n">681213</span>
<span class="number"> 154</span>rand4 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">441000</span>s
<span class="number"> 155</span>
<span class="number"> 156</span>rand5 distribution:
<span class="number"> 157</span> <span class="n">1</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 158</span> <span class="n">2</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 159</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 160</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 161</span> <span class="n">5</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 162</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 163</span> <span class="n">7</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 164</span> <span class="n">8</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 165</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 166</span><span class="n">10</span><span class="k2">:</span> <span class="n">327680</span> <span class="k2">(</span><span class="n">100</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 167</span>rand5 collisions: <span class="n">327679</span>
<span class="number"> 168</span>rand5 unused: <span class="n">65535</span>
<span class="number"> 169</span>rand5 longest chain: <span class="n">327680</span>
<span class="number"> 170</span>rand5 variance: <span class="n">1638375</span>.<span class="n">000000</span>
<span class="number"> 171</span>rand5 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">300000</span>s
<span class="number"> 172</span>
<span class="number"> 173</span>rand6 distribution:
<span class="number"> 174</span> <span class="n">1</span><span class="k2">:</span> <span class="n">32632</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9585</span><span class="k2">)</span>
<span class="number"> 175</span> <span class="n">2</span><span class="k2">:</span> <span class="n">32959</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0583</span><span class="k2">)</span>
<span class="number"> 176</span> <span class="n">3</span><span class="k2">:</span> <span class="n">32844</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0232</span><span class="k2">)</span>
<span class="number"> 177</span> <span class="n">4</span><span class="k2">:</span> <span class="n">32660</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9670</span><span class="k2">)</span>
<span class="number"> 178</span> <span class="n">5</span><span class="k2">:</span> <span class="n">32470</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9091</span><span class="k2">)</span>
<span class="number"> 179</span> <span class="n">6</span><span class="k2">:</span> <span class="n">32908</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0427</span><span class="k2">)</span>
<span class="number"> 180</span> <span class="n">7</span><span class="k2">:</span> <span class="n">32880</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0342</span><span class="k2">)</span>
<span class="number"> 181</span> <span class="n">8</span><span class="k2">:</span> <span class="n">32775</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0021</span><span class="k2">)</span>
<span class="number"> 182</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32654</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9652</span><span class="k2">)</span>
<span class="number"> 183</span><span class="n">10</span><span class="k2">:</span> <span class="n">32871</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0314</span><span class="k2">)</span>
<span class="number"> 184</span>rand6 collisions: <span class="n">311296</span>
<span class="number"> 185</span>rand6 unused: <span class="n">49152</span>
<span class="number"> 186</span>rand6 longest chain: <span class="n">49</span>
<span class="number"> 187</span>rand6 variance: <span class="n">84</span>.<span class="n">395538</span>
<span class="number"> 188</span>rand6 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">441000</span>s
<span class="number"> 189</span>
<span class="number"> 190</span>rand7 distribution:
<span class="number"> 191</span> <span class="n">1</span><span class="k2">:</span> <span class="n">327680</span> <span class="k2">(</span><span class="n">100</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 192</span> <span class="n">2</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 193</span> <span class="n">3</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 194</span> <span class="n">4</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 195</span> <span class="n">5</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 196</span> <span class="n">6</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 197</span> <span class="n">7</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 198</span> <span class="n">8</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 199</span> <span class="n">9</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 200</span><span class="n">10</span><span class="k2">:</span>  <span class="n">0</span> <span class="k2">(</span><span class="n">0</span>.<span class="n">0000</span><span class="k2">)</span>
<span class="number"> 201</span>rand7 collisions: <span class="n">327679</span>
<span class="number"> 202</span>rand7 unused: <span class="n">65535</span>
<span class="number"> 203</span>rand7 longest chain: <span class="n">327680</span>
<span class="number"> 204</span>rand7 variance: <span class="n">1638375</span>.<span class="n">000000</span>
<span class="number"> 205</span>rand7 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">340000</span>s
<span class="number"> 206</span>
<span class="number"> 207</span>rand8 distribution:
<span class="number"> 208</span> <span class="n">1</span><span class="k2">:</span> <span class="n">32660</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9670</span><span class="k2">)</span>
<span class="number"> 209</span> <span class="n">2</span><span class="k2">:</span> <span class="n">32595</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9472</span><span class="k2">)</span>
<span class="number"> 210</span> <span class="n">3</span><span class="k2">:</span> <span class="n">32798</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0092</span><span class="k2">)</span>
<span class="number"> 211</span> <span class="n">4</span><span class="k2">:</span> <span class="n">32815</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0143</span><span class="k2">)</span>
<span class="number"> 212</span> <span class="n">5</span><span class="k2">:</span> <span class="n">32771</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0009</span><span class="k2">)</span>
<span class="number"> 213</span> <span class="n">6</span><span class="k2">:</span> <span class="n">32731</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9887</span><span class="k2">)</span>
<span class="number"> 214</span> <span class="n">7</span><span class="k2">:</span> <span class="n">32505</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9197</span><span class="k2">)</span>
<span class="number"> 215</span> <span class="n">8</span><span class="k2">:</span> <span class="n">32920</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0464</span><span class="k2">)</span>
<span class="number"> 216</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32875</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0327</span><span class="k2">)</span>
<span class="number"> 217</span><span class="n">10</span><span class="k2">:</span> <span class="n">32986</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0665</span><span class="k2">)</span>
<span class="number"> 218</span>rand8 collisions: <span class="n">262584</span>
<span class="number"> 219</span>rand8 unused: <span class="n">440</span>
<span class="number"> 220</span>rand8 longest chain: <span class="n">18</span>
<span class="number"> 221</span>rand8 variance: <span class="n">5</span>.<span class="n">009186</span>
<span class="number"> 222</span>rand8 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">471000</span>s
<span class="number"> 223</span>
<span class="number"> 224</span>rand9 distribution:
<span class="number"> 225</span> <span class="n">1</span><span class="k2">:</span> <span class="n">32660</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9670</span><span class="k2">)</span>
<span class="number"> 226</span> <span class="n">2</span><span class="k2">:</span> <span class="n">32595</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9472</span><span class="k2">)</span>
<span class="number"> 227</span> <span class="n">3</span><span class="k2">:</span> <span class="n">32798</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0092</span><span class="k2">)</span>
<span class="number"> 228</span> <span class="n">4</span><span class="k2">:</span> <span class="n">32815</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0143</span><span class="k2">)</span>
<span class="number"> 229</span> <span class="n">5</span><span class="k2">:</span> <span class="n">32771</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0009</span><span class="k2">)</span>
<span class="number"> 230</span> <span class="n">6</span><span class="k2">:</span> <span class="n">32731</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9887</span><span class="k2">)</span>
<span class="number"> 231</span> <span class="n">7</span><span class="k2">:</span> <span class="n">32505</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9197</span><span class="k2">)</span>
<span class="number"> 232</span> <span class="n">8</span><span class="k2">:</span> <span class="n">32920</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0464</span><span class="k2">)</span>
<span class="number"> 233</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32875</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0327</span><span class="k2">)</span>
<span class="number"> 234</span><span class="n">10</span><span class="k2">:</span> <span class="n">32986</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0665</span><span class="k2">)</span>
<span class="number"> 235</span>rand9 collisions: <span class="n">262584</span>
<span class="number"> 236</span>rand9 unused: <span class="n">440</span>
<span class="number"> 237</span>rand9 longest chain: <span class="n">18</span>
<span class="number"> 238</span>rand9 variance: <span class="n">5</span>.<span class="n">009186</span>
<span class="number"> 239</span>rand9 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">541000</span>s
<span class="number"> 240</span>
<span class="number"> 241</span>rand0 distribution:
<span class="number"> 242</span> <span class="n">1</span><span class="k2">:</span> <span class="n">32947</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0546</span><span class="k2">)</span>
<span class="number"> 243</span> <span class="n">2</span><span class="k2">:</span> <span class="n">33048</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0854</span><span class="k2">)</span>
<span class="number"> 244</span> <span class="n">3</span><span class="k2">:</span> <span class="n">32361</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">8758</span><span class="k2">)</span>
<span class="number"> 245</span> <span class="n">4</span><span class="k2">:</span> <span class="n">32755</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9960</span><span class="k2">)</span>
<span class="number"> 246</span> <span class="n">5</span><span class="k2">:</span> <span class="n">32558</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9359</span><span class="k2">)</span>
<span class="number"> 247</span> <span class="n">6</span><span class="k2">:</span> <span class="n">32809</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0125</span><span class="k2">)</span>
<span class="number"> 248</span> <span class="n">7</span><span class="k2">:</span> <span class="n">32910</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0433</span><span class="k2">)</span>
<span class="number"> 249</span> <span class="n">8</span><span class="k2">:</span> <span class="n">32640</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9609</span><span class="k2">)</span>
<span class="number"> 250</span> <span class="n">9</span><span class="k2">:</span> <span class="n">32930</span> <span class="k2">(</span><span class="n">10</span>.<span class="n">0494</span><span class="k2">)</span>
<span class="number"> 251</span><span class="n">10</span><span class="k2">:</span> <span class="n">32682</span> <span class="k2">(</span><span class="n">9</span>.<span class="n">9738</span><span class="k2">)</span>
<span class="number"> 252</span>rand0 collisions: <span class="n">262574</span>
<span class="number"> 253</span>rand0 unused: <span class="n">430</span>
<span class="number"> 254</span>rand0 longest chain: <span class="n">17</span>
<span class="number"> 255</span>rand0 variance: <span class="n">4</span>.<span class="n">976532</span>
<span class="number"> 256</span>rand0 <span class="n">327680</span><span class="k2">:</span> <span class="n">0</span>.<span class="n">951000</span>s
</div></div><p>

As you can see, the later rand-family hash functions held their own against the big boys, producing comparable results, and even toppled the venerable allegro hash in distribution ability. rand8 was the winner in speed overall for the &quot;good&quot; functions, and was comparable for the other stats.</p><p>Next I&#039;ll have to take another peek at Bob&#039;s hashmap code. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Wed, 27 Jul 2005 07:04:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, also, those hash functions are unaffected by leading 0s, at least if they occur in sets of four.  Consider initializing seed to len (as Bob Jenkins does if I recall correctly), or some other such fix for that.  </p><p>Here is the results of a test I wrote.  The test generates a random 50 byte string of binary data, hashes it, changes a random bit, hashes it again, etc, (1&lt;&lt;18) times.  The complication is, it checks that it hasn&#39;t accidentally gone back to a string it used earlier.   For &quot;norm&quot;, it changes any bit in the string, for &quot;low&quot; it changes only the first 48 bits, for &quot;high&quot; it changes only the last 48 bits.  The result is the number of hashes produced that were already produced earlier.  
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>       md5 norm test:     <span class="n">8</span> collisions</td></tr><tr><td class="number">2</td><td>       md5 low test:      <span class="n">8</span> collisions</td></tr><tr><td class="number">3</td><td>       md5 high test:     <span class="n">9</span> collisions</td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>bobjenkins norm test:     <span class="n">9</span> collisions</td></tr><tr><td class="number">6</td><td>bobjenkins low test:      <span class="n">8</span> collisions</td></tr><tr><td class="number">7</td><td>bobjenkins high test:     <span class="n">5</span> collisions</td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>       crc norm test: <span class="n">224014</span> collisions</td></tr><tr><td class="number">10</td><td>       crc low test:  <span class="n">262143</span> collisions</td></tr><tr><td class="number">11</td><td>       crc high test: <span class="n">36001</span> collisions</td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>       pjw norm test:  <span class="n">3517</span> collisions</td></tr><tr><td class="number">14</td><td>       pjw low test:   <span class="n">5079</span> collisions</td></tr><tr><td class="number">15</td><td>       pjw high test:  <span class="n">2943</span> collisions</td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>      OAAT norm test:     <span class="n">2</span> collisions</td></tr><tr><td class="number">18</td><td>      OAAT low test:      <span class="n">9</span> collisions</td></tr><tr><td class="number">19</td><td>      OAAT high test:    <span class="n">12</span> collisions</td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td> superfast norm test:    <span class="n">16</span> collisions</td></tr><tr><td class="number">22</td><td> superfast low test:    <span class="n">129</span> collisions</td></tr><tr><td class="number">23</td><td> superfast high test:    <span class="n">99</span> collisions</td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>   allegro norm test: <span class="n">222198</span> collisions</td></tr><tr><td class="number">26</td><td>   allegro low test:  <span class="n">262143</span> collisions</td></tr><tr><td class="number">27</td><td>   allegro high test: <span class="n">152055</span> collisions</td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> norm test: <span class="n">217674</span> collisions</td></tr><tr><td class="number">30</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> low test:  <span class="n">262143</span> collisions</td></tr><tr><td class="number">31</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a> high test: <span class="n">196681</span> collisions</td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>     rand2 norm test: <span class="n">187825</span> collisions</td></tr><tr><td class="number">34</td><td>     rand2 low test:  <span class="n">262143</span> collisions</td></tr><tr><td class="number">35</td><td>     rand2 high test: <span class="n">91565</span> collisions</td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>     rand3 norm test: <span class="n">187642</span> collisions</td></tr><tr><td class="number">38</td><td>     rand3 low test:  <span class="n">262143</span> collisions</td></tr><tr><td class="number">39</td><td>     rand3 high test: <span class="n">90975</span> collisions</td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>     rand4 norm test: <span class="n">258556</span> collisions</td></tr><tr><td class="number">42</td><td>     rand4 low test:  <span class="n">260884</span> collisions</td></tr><tr><td class="number">43</td><td>     rand4 high test: <span class="n">260893</span> collisions</td></tr><tr><td class="number">44</td><td>&#160;</td></tr><tr><td class="number">45</td><td>     rand5 norm test: <span class="n">114573</span> collisions</td></tr><tr><td class="number">46</td><td>     rand5 low test:  <span class="n">261628</span> collisions</td></tr><tr><td class="number">47</td><td>     rand5 high test: <span class="n">18530</span> collisions</td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>     rand8 norm test:    <span class="n">13</span> collisions</td></tr><tr><td class="number">50</td><td>     rand8 low test:     <span class="n">19</span> collisions</td></tr><tr><td class="number">51</td><td>     rand8 high test:    <span class="n">33</span> collisions</td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td>     rand9 norm test:    <span class="n">12</span> collisions</td></tr><tr><td class="number">54</td><td>     rand9 low test:     <span class="n">29</span> collisions</td></tr><tr><td class="number">55</td><td>     rand9 high test:    <span class="n">37</span> collisions</td></tr><tr><td class="number">56</td><td>&#160;</td></tr><tr><td class="number">57</td><td>     rand0 norm test:     <span class="n">3</span> collisions</td></tr><tr><td class="number">58</td><td>     rand0 low test:     <span class="n">11</span> collisions</td></tr><tr><td class="number">59</td><td>     rand0 high test:    <span class="n">10</span> collisions</td></tr></tbody></table></div></div><p>

Any value up to 15 can be reasonably dismissed as random fluctuations.  Thus, OAAT and rand0 produce perfect results, superfast, rand8, and rand9 produce acceptable results, and everything else produces bad results.  &quot;md5&quot;, and &quot;bobjenkins&quot; are added as sanity checks.  </p><p>I&#39;ll write a more thorough test function tomorrow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Wed, 27 Jul 2005 09:25:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ahh, that&#39;s great. Could you post your test code when you&#39;ve finished, so I can cobble together a comprehensive mega-test?</p><p>And do you mean the leading 4 zeroes in the key, or the seed?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Wed, 27 Jul 2005 16:51:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Lets see if this works...</p><p>Everything specific to your stuff is in h.cpp.  The rest of it is random stuff related to random number generation and testing, which shares a bunch of code with this since it was a quick hack to get the random number tests working on hash functions.  </p><p>Using longer samples (up to 16 million hashes), hash_rand0 failed a few tests, but OAAT still prevailed.  I&#39;ve started a 256-million-hash test in an effort to get OAAT to break down and cry, but it will be a while before that finishes.  </p><p>Four leading 0s on the &quot;key&quot; will produce an identical result, like these two string &quot;ab&quot;, &quot;\0\0\0\0ab&quot;.  </p><p>If all went well, that should produce output like this:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>       md5 low:       <span class="n">6</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">2</td><td>       md5 norm:      <span class="n">8</span> collisions, tests: passed <span class="n">6</span>, failed <span class="n">0</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">3</td><td>       md5 high:      <span class="n">6</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>bobjenkins low:       <span class="n">8</span> collisions, tests: passed <span class="n">6</span>, failed <span class="n">0</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">6</td><td>bobjenkins norm:      <span class="n">4</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">7</td><td>bobjenkins high:      <span class="n">7</span> collisions, tests: passed <span class="n">6</span>, failed <span class="n">0</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>       crc low:  <span class="n">223878</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">10</td><td>       crc norm: <span class="n">262143</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">11</td><td>       crc high:  <span class="n">36268</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>       pjw low:    <span class="n">3360</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">14</td><td>       pjw norm:   <span class="n">5037</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">15</td><td>       pjw high:   <span class="n">2962</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>      OAAT low:       <span class="n">8</span> collisions, tests: passed <span class="n">6</span>, failed <span class="n">0</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">18</td><td>      OAAT norm:      <span class="n">8</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">19</td><td>      OAAT high:      <span class="n">7</span> collisions, tests: passed <span class="n">4</span>, failed <span class="n">0</span>, ambiguous <span class="n">2</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td> superfast low:      <span class="n">22</span> collisions, tests: passed <span class="n">6</span>, failed <span class="n">0</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">22</td><td> superfast norm:    <span class="n">145</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">1</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">23</td><td> superfast high:     <span class="n">87</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>   allegro low:  <span class="n">221981</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">26</td><td>   allegro norm: <span class="n">262143</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">27</td><td>   allegro high: <span class="n">153358</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">6</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>     rand8 low:       <span class="n">7</span> collisions, tests: passed <span class="n">3</span>, failed <span class="n">2</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">30</td><td>     rand8 norm:     <span class="n">24</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">31</td><td>     rand8 high:     <span class="n">51</span> collisions, tests: passed <span class="n">0</span>, failed <span class="n">5</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>     rand9 low:      <span class="n">13</span> collisions, tests: passed <span class="n">2</span>, failed <span class="n">2</span>, ambiguous <span class="n">2</span></td></tr><tr><td class="number">34</td><td>     rand9 norm:     <span class="n">18</span> collisions, tests: passed <span class="n">6</span>, failed <span class="n">0</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">35</td><td>     rand9 high:     <span class="n">40</span> collisions, tests: passed <span class="n">1</span>, failed <span class="n">5</span>, ambiguous <span class="n">0</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>     rand0 low:       <span class="n">9</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">38</td><td>     rand0 norm:     <span class="n">14</span> collisions, tests: passed <span class="n">5</span>, failed <span class="n">0</span>, ambiguous <span class="n">1</span></td></tr><tr><td class="number">39</td><td>     rand0 high:      <span class="n">7</span> collisions, tests: passed <span class="n">2</span>, failed <span class="n">3</span>, ambiguous <span class="n">1</span></td></tr></tbody></table></div></div><p>

edit: fixed an issue where tests were labelled incorrectly</p><p>edit2: <br />Sorry about the comment at the top.  <br />I&#39;ve removed it.  I was in a bad mood, when I wrote that, and then forgot about it.  It was totally uncalled for.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Wed, 27 Jul 2005 19:47:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, the four leading zeroes I mentioned are ascii characters, not bytes.</p><p>Hmm, the rand series, though failing some tests, still seems to be doing respectably. I suspect that the failing may be in the actual rand portion of the &quot;avalanche&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Wed, 27 Jul 2005 21:42:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was confused when I said OAAT was passing... it wasn&#39;t, I had it displaying the wrong results for one category which it was failing.  Still OAAT did pretty well, along with hash_rand0.  I recommend trying hash functions with more than 32 bits of state.  </p><p>Anyway, it&#39;s of course impossible to create a perfect omni-purpose hash function, as there are tradeoffs between speed, quality, and extras (suitability for hardware implementation, cryptographic security, etc).  But with a little trial-and-error, a little luck or insight, and maybe even a dab of theory, it ought to be possible to create a hash function that compares favorably to existing ones in almost any specific niche you care to aim at.  Good luck.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Fri, 29 Jul 2005 14:05:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So, rand0 seems to be pretty good <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /><br />How does it compare when it comes to speed and memory used?</p><p>Also, let&#39;s say I&#39;d use one of these algos to create a hashtable with say, 256 entries, would rand0 still be the candidate I want?<br />I mean, if I&#39;d do a (rand0() &amp; 255) would I still get a good distribution?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (spellcaster)</author>
		<pubDate>Sat, 30 Jul 2005 04:39:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think thats the point of this whole thing, having good distrobution and speed for power of two sized hash tables. unlike pjw that requires say a table thats some &quot;prime&quot; number in size.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sat, 30 Jul 2005 05:01:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>lenny, since it&#39;s just a hash function, it really uses no memory other than the local variables needed to calculate the hash value. rand8/9 are faster than rand0, so I&#39;d prefer rand8 for typical usage. All of my testing was aimed at power-of-two-sized tables, and I&#39;ve shown that rand0/8/9()&amp;255 will give you good distribution over such a table (the one I used for testing in the end was 65536 elements)... much better than pjw, crc, or allegro hashes.</p><p>orz has shown that rand8 and rand9 break down somewhat with intensive testing, but the tests he used are rather high-octane. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> The rand functions are quite good when compared alongside the other common hash functions for their intended usage (hashing strings into ^2 tables). They are also faster, which was my main goal. Just don&#39;t use them for any serious encryption purposes. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Sat, 30 Jul 2005 06:53:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Anything that does well on the tests is likely to do well in real world circumstances.  Of course, that&#39;s just a guess on my part - I don&#39;t have any large database of real-world data to try out.  The biggest flaw in the tests (that I can think of, anyway...) is that they only compare hashes of strings of one specific length at time.  Also, they look for flaws in all bits of the result, whereas in the real world, often only the high or low bits will be used.  </p><p>edit: On second thought, the tests also spend a great deal of effort looking for correlations in results for similar strings, which doesn&#39;t matter (under some circumstances) in real world hash tables.  In short, the tests are overkill for hash functions intended for use in hash tables.  I may revise them soon to ignore flaws that are irrelevant for normal hash tables.  </p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>edit: on Athlon XP <span class="n">2500</span><span class="k3">+</span></td></tr><tr><td class="number">2</td><td>Performance data, <span class="n">4</span> byte strings:</td></tr><tr><td class="number">3</td><td>       md5 performance <span class="k3">=</span>   <span class="n">2</span>.<span class="n">4</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">4</td><td>bobjenkins performance <span class="k3">=</span>  <span class="n">11</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">5</td><td>       crc performance <span class="k3">=</span>  <span class="n">37</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">6</td><td>       pjw performance <span class="k3">=</span>  <span class="n">32</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">7</td><td>      OAAT performance <span class="k3">=</span>  <span class="n">31</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">8</td><td> superfast performance <span class="k3">=</span>  <span class="n">36</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">9</td><td>   allegro performance <span class="k3">=</span>  <span class="n">41</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">10</td><td>     rand8 performance <span class="k3">=</span>  <span class="n">45</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">11</td><td>     rand9 performance <span class="k3">=</span>  <span class="n">42</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">12</td><td>     rand0 performance <span class="k3">=</span>  <span class="n">32</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>Performance data, <span class="n">61</span> byte strings:</td></tr><tr><td class="number">15</td><td>       md5 performance <span class="k3">=</span>  <span class="n">24</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">16</td><td>bobjenkins performance <span class="k3">=</span>  <span class="n">38</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">17</td><td>       crc performance <span class="k3">=</span>  <span class="n">88</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">18</td><td>       pjw performance <span class="k3">=</span>  <span class="n">59</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">19</td><td>      OAAT performance <span class="k3">=</span>  <span class="n">72</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">20</td><td> superfast performance <span class="k3">=</span> <span class="n">183</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">21</td><td>   allegro performance <span class="k3">=</span> <span class="n">132</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">22</td><td>     rand8 performance <span class="k3">=</span> <span class="n">217</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">23</td><td>     rand9 performance <span class="k3">=</span> <span class="n">151</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">24</td><td>     rand0 performance <span class="k3">=</span>  <span class="n">80</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>Performance data, <span class="n">1024</span> byte strings:</td></tr><tr><td class="number">27</td><td>       md5 performance <span class="k3">=</span>  <span class="n">67</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">28</td><td>bobjenkins performance <span class="k3">=</span>  <span class="n">55</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">29</td><td>       crc performance <span class="k3">=</span>  <span class="n">96</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">30</td><td>       pjw performance <span class="k3">=</span>  <span class="n">73</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">31</td><td>      OAAT performance <span class="k3">=</span>  <span class="n">92</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">32</td><td> superfast performance <span class="k3">=</span> <span class="n">288</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">33</td><td>   allegro performance <span class="k3">=</span> <span class="n">155</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">34</td><td>     rand8 performance <span class="k3">=</span> <span class="n">334</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">35</td><td>     rand9 performance <span class="k3">=</span> <span class="n">185</span> MB<span class="k3">/</span>s</td></tr><tr><td class="number">36</td><td>     rand0 performance <span class="k3">=</span>  <span class="n">88</span> MB<span class="k3">/</span>s</td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Sat, 30 Jul 2005 07:16:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My hash code supports automagic resizing of hash tables, as well as fast look-ups in the average case (ie: it stops looking when it find a hole in the hash table). My hash code assumes you have a hash value, and some compare function available.</p><p>In this case, you would be able to use strcmp() as the compare function, and rand0 or rand8 as your hash function. My hash table code should handle the rest.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Sat, 30 Jul 2005 08:00:19 +0000</pubDate>
	</item>
</rss>
