OpenCL perft() Technical Issues

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

User avatar
Ajedrecista
Posts: 1968
Joined: Wed Jul 13, 2011 9:04 pm
Location: Madrid, Spain.

Re: The great battle of hash codes.

Post by Ajedrecista »

Hello Steven:

I have just coded a tiny programme in Fortran 95 using the intrinsic built-in PRNG random@() contained in Silverfrost Plato IDE. Here is a piece of the code:

Code: Select all

program hash
implicit none
integer,parameter::nmax=824,imax=32
integer::i,n
real(3)::azar
open(unit=11,file='a.txt',status='unknown',action='write')
do n=1,nmax
  do i=1,imax
    azar=random@()
    if (azar>9.375d-1) then
      write(11,'(A)',advance='no') 'f'
    else if (azar>8.75d-1) then
      write(11,'(A)',advance='no') 'e'
[...]
    else if (azar>6.25d-2) then
      write(11,'(A)',advance='no') '1'
    else
      write(11,'(A)',advance='no') '0'
    end if
  end do
  write(11,*)
end do
close(11)
end program
And here is the output text file:

Code: Select all

61f090ddd53fd3358bd81394f4fa5ec9 
6be29c85c8bac91f96123e21ae45c3ab 
1c96cb08207975c211e810a7f6207ff7 
77130f0e06e2b5a796490790b9c673af 
f107244499dd0faec7f86789d3bbd3c1 
ca987b3dba69649135bbf45d9e12e296 
cf14d75893b54b4a516005d72a82d2c4 
d73bbd2eaec1aba30d959b2f3212970f 
c65026b1c28b9699f75adef923d05edb 
69e5a9ff357deaf76898527bbd9bf4c6 
afbda7dd4caf8a70477a6bbfdf97e640 
9980414b22e6b386ba1c1928c81248b2 
b89b2dd8a4100c6f7421bd859f33e260 
70f29fbbf799a01a8fc343c6998886e9 
8c4904ffd9c9bfed336ca7a92a70934f 
9c9c59f926a9db29c5d75d7390b89ce8 
8d36dab4bf7f13d0dd9610d14207a605 
515d3400a055841474bffff2e6a25eb6 
e051206bd388a709e057146470475760 
9bf27bd486d229f441b5460f78c13307 
a6a65e1f9d35aef063295abe2a2d3907 
09e14b5bd802f7b7c09b9d85e3a08ae0 
e3d983663f72ff0bcaddeecb21747f45 
a93f03daba69bf2378287529afc6bf3b 
9f32f459564a531a06bca135828ecf1f 
edda7b50f6ee45d2eee7440344a0064c 
439b67a2b5bed7ee58b06072264363b1 
ca2edb48d3a928ac14295cfaafdaa175 
a81badcd16ee241611d5870b1a49c925 
9a9242da042f8a9b0099cb68c005d9ca 
0e296582df34cb144d5add0f9b69d9b1 
59aeae17e04288dc42ecadc197813a8d 
3a96c9bc33c3241dee3d879b7c72eec9 
8a8b70f8ce550b1823e99687287d4683 
55fe1a479a66140341c2ab7025e993b2 
604d0fa2a313a7231cc3c706fbb74ac7 
199482519ed64d12df7aeaad8ebf8e8a 
d6dd981855af7562ce795e0f893f77d5 
adf6e1ba7f0000475bc7d9f45aaa5c80 
8dc37fc885c17ca24afe2fbeb305fa7b 
52dbdfe4badd1d946561332015c03714 
374463f1ceb66ffe4d53a15adac59cb4 
76534b490aaa3fd9fa62d49b99ce9f0e 
280c17e44a69369d141ddd8e73b0294e 
c5a3de8982817d8170053c5bf89618ff 
91bc0039608f119988c0f99a0ab4c14f 
5355200c5aae97c6f19aefe24c7ec999 
9d61c0b49f45d3ef53d6d0b19468a332 
1577e1bf01f9ca55069f430bee24634f 
44bd07a58e2d68c363128fba9fe9da33 
e3ecf37543796ed832836237791ceaab 
07115fdc4b484873b1cfc86900351e50 
1d913bf829725be080338586b8a5ca27 
959962ea35edcd939553e7e1e2e19a48 
17f20706525bebf67ea61e7cd6cc014e 
e70f122aee48e5fb28386a4636cb0cdc 
2f3784ce551074944b397245567101a3 
0e158fdf8058eef4d67232bc84d2a6a4 
c17fea4d96dd5f5baf545c7e48eece84 
04f689f3bbdff4ab3c88e3968f63c0db 
859a469f984c9a3a389bba73c812a449 
1d6865ed66a4e6402f5c11822c25afe0 
7d9b9848d143e4638dd2ab3fdff00872 
c7c4e9cab39606d9c5fe2a3af35ff415 
7ab31eb4b2fe028122d310336ea32d2f 
53c784227adf27b2c81904918b223dd5 
eb09461bd4cacb969c51fe4fa4255c5a 
9709b933632f635e1c02a2465c97eb81 
1cdde388efcae391b3d87f913d3b110e 
773e990e959256b2d70a4c2b6284273c 
93e82de9f87de1e29e94d85ff582b4ec 
d002c35ee4f7c846902ba8ce72d38e81 
6215e8120ece660bb16a8a8b864d5238 
6b3de3548540682526b34c88e716ded5 
c36688dae3aa5825187474bdcc1a4f18 
abf164ef095d897a5bb691d7b0ce1eee 
f84b5f1a06fdaeeaf3cf037eeb292f19 
4c164de2202fd1a6b111b135650cce2e 
d7acc6ff5af914f597d59f7a5cbbe74e 
023d75823c42c5555cff44ab3e578379 
4531b7a429c9d776da81849cc365707e 
98d00f92b5005cfa4d210e9daf57bcce 
899a098979f957c330574dd07f66e529 
399c1751ab2e593193d1e9924ff59321 
81f6aaf0d4457e7214a7713337ac01da 
899c0eb93b07a7e51cde2a3f1e63fdae 
3662f56203c9a96820528246645c02b5 
1dab8ec070aaf1b14b6ebfa5ea5d40e2 
ebbcec00fefa3cdc81565685ec52ed51 
e78b6ff0d9facb60f6367478f32d820b 
1a45d8fdfc7dcf970c4194313d69fdbc 
e7dad4ccdb58a365c12903e025d0f224 
4bd1a75a267488620148cf78b6977654 
a118a7f24a602ee12aedcb3c8b1ab175 
d210ab31121d51faac8ddb2c547065f2 
7c4bb708f6418308fd42c8dbcc61fc72 
e3ff6f42e16351fbdefc723edf2c1d24 
dc92167d41820f172f8fc6ef53313c23 
a4a9551ee598a35d7bcc27ed7920afb8 
ca55b40ebd947c983422ed0e850772a7 
e1db53a7b50eb1be1bed8bac8ee0170d 
28ed4487e35352b7f851642b9c52835d 
1252c73bdc615f285af9fbbfd438d86b 
a852c4a77157ea4c1031b850199daedd 
39f55e6be0030cbe04559dfb2376a181 
10704c728e6f9befc1a87e0c74bc6cbf 
1aa41eb48b2f4f4ed1127dd18ee67e5f 
2f5d38a1ac6cb3cb0e83550124ba3603 
fce12de721d1244988df1d3d2d3bd339 
37bb7433b10151b64942ce633ff783e6 
b738d08f67753b495f52b4f5833cbd80 
62752816de77e32d3283497a860db8fa 
969ad6ea5153d8b965b95037f65f5152 
f4ab95124c727ed2979017d1f72d7ba3 
a27561f40696c48f64fe4f9e08311054 
fe47f85b3f198b986669dac568e04e66 
332cf7a2359731261f4ef2bd257dab26 
82b4b3b2b660ddb46b373820d369bbc2 
9cb9f5249e6e35e5b3bae259e692d230 
d7f290ddff3aac8eb2d5b458631ecc0d 
f496c87ef291fe1fe69f46ec629ffa4e 
981a9e41ec5c20fc1d1bf3757a77b2e6 
fc5331c08bf0cdf7d65f9c40c0137aee 
e6c0aae39b182995d44dafe5f521db7a 
3491ab1c50aaffaeb46d420dbdd56f8a 
d1fe372ea41ee4c9d1584fec8ec81c46 
89ff5890d1fec8b0be783ff9ac7468bc 
c60e7a014327c4bb7d7efc314741f75c 
ff747a322bc1a2d675b88fb66c02fac3 
3182727c74a9801b02209d0042c5729c 
f2c3dacbe1648b8b13e894c8052e8e4f 
ae4d4b2c978404c1b89b2b7e0cba88f1 
6a8bf31f3e87723ed4d4f6a13a2aa75e 
a4b5d56937fa46b03f297dace1aac0bb 
98444c3a1f4f97a993de3d07ae06c73d 
ca6e3389c97e41b0d3f6b80d243e196e 
3da932b8780f88b2d9a5e910f7acd795 
d4ad368514a81fdd94815b886fbc700c 
fe5279653b9f724a7ecf5be1941026c4 
e0d7e8ae5d69d21075d2b55eb77e51e5 
1e210d356d431709578e2db9060c23a8 
4a6d2b55266dfaa03b8160abe02b7c6f 
c45771103a64080ccf83f97821acb1c7 
8c02288b731ed8f145f69e94ec82a82d 
1845871a6f26f5c10da184a455d0c3bc 
648e514b47ede47028d905b683fb968a 
77f63cca3a6e1f74eb4fc2c7f4962e2c 
0c0fb75f05f4875eb69debcc98c90c6a 
6e2f7dbc768f8a9fc2f19c28fa1ed34b 
ec5a9a0ce7f1f5222c81f6b5c7edeb52 
1fc0143fa7ec6ae3036a27b1e54de3fd 
bde047548b11634975722044b5f6515f 
c7b426f3896112d4d0c9ee1b399283fa 
e19f44c11d6293acc13ea34b937db3bd 
1799901cada8b5b6b04b6f926bdd47cd 
a182f0bd9e0f51f80a069079d38102dd 
18f798eff48a994c1f64f8191cf99873 
eacbde4f40f99fb502699c91ccfd138d 
42ae86557a6814cd6430b3685c6f1088 
abcfa451a32dc27ba87c1452743bd533 
fd0b8a8139e06b487b3674ab89927bdc 
7955c39e555583588a86c351f35d1a2b 
9e914a525f6a3214ef2953473f7fc8f5 
52eb2845ba68f63dd95a0463df29d4a5 
a39fb3c47b36f1183fec48dc2212b9e0 
2d0198b562c8fb294a56f26e5bc541c9 
1e27df9779505bfb521ccf0587a5f038 
182ff3c83cb43cae28b7327f2ae44cf4 
5f47edbd146ed6a63546d1072cdf8c37 
0249920b1ab7a2e0e0ea3cff56e513ad 
d39308a5f7c5e2354f49ff46c7e6c413 
7ea484815ff946cdf010f40b754e36b5 
2f235c59825df63081a014267f3f071f 
d205e631502adad17b817e2ea5284cc7 
050fbb885a30bfc7ea5295ada9ab23c8 
c1d8ce428861a8ae600ebdda14ab0543 
b29a803fb7ae2013c9a339c1725ccf01 
be21a99aae91c09dd52fce7d36722cfa 
b88b2a0f2959508941c3103b9b91b2e7 
b4beabbc995cd5a5f59ca0d4685307b7 
48de4ba3f6927082a4e8255f4c11735f 
3c73ad3ff2baf34c5efc2e12dc4c931e 
4605116c42a5538f8ff13f75c768f906 
43c485353e5ede5780c62d2474e27180 
f21d0f53a0185137398cb051df97f220 
f2b9df24076b6eb77115bcd66b76063f 
1b9464b3851ff6392417404cab2ac8d7 
0c2ce7bf4e2b8a1e38744a98b6b5b4d3 
356e2ec938c76281cd305184b3758e84 
3f1400f68b0d7c27724cdc23a0866109 
d1720510467859835b788f812f775564 
53d710fa6e9d13e37d298f73a5e88db3 
01df877d8486919a22a0d05080c1b114 
ff4743680768fa5101e2556d5b649a58 
a88da814c476216c46805268588b6717 
df50b4b9231ebd8f9eb68e2fe88a8a29 
94bf66f24d7ef6796db16cd1146ba0a8 
23fcfdde9406c84a2dd843704e9d25ea 
3cd626fb28bad8794361f5a07f0a0f2d 
53ad7ceae23aca7d62a18a07a3e327b2 
8e2ebab53a99e56c63a68ebb4d2d2894 
6597e512bbe6823b9990a1ed57bdc384 
0e24b3c78a61a444b143b698cf784d17 
876093160e9c85148a8b3d5dc9c93228 
601c8294bdb3f590b001f988b77cacd9 
7dafb2a9cbb0d4192c942cb68f8d3cb9 
845bb7995ae09c5edff789b0b59f0a4c 
0b50f267a61fd02b1e777d7979ad85b9 
404e72324e602302d012c9cfb8aff7ac 
1cc5f138568d5ccbe489ec334cb5e214 
90f4e99865cdaa39d49f739eb16e778f 
2e09ba5e2c197924565c0ce76903c326 
2f0f603f948705086a904439a9e302b0 
62c3580d60b5dc0ca0af3a8e61488865 
8f4c1fdb2c0dfbbb9bb35db8707b063b 
fd1ae161c6ad2abc27ff8c8472f812c8 
a1a1bc18ab17a7aa849515ab30f96508 
e9eb447b0bf55bb242866fb8a9cf5e3d 
88d8c6c30fe3a2e0f4c129e0ddef15ab 
1c6186876028d878c889eb88bacd35f9 
6bad64dccdabfc3214cd46e6f4cd8690 
b4f60cad78969ff507c2a4f8482948c4 
3e9ea4dfa97282c1cd61d61e239ad6ab 
ce6a183607cfa3ca5ab6c51496efd281 
09d9f77653600fe1dcfe6c3d74e92800 
16d8188db99ab2103089df8d34fa7356 
b90527f72711ed89c4b1bf0f0cc44395 
f6bc0b859c0c8d900f7dd0b1c92aea30 
4d34c0985ae015cfe306e08edb9380d6 
6049b6711234355871a89e067b829f32 
43975955ac750d34eb4d68bee578c548 
48610d94d8bd0b341b9b54e821a94b5d 
4a972bc45560048f5598e18211750564 
77ed3c6b989a6f3f8eda0245217210fa 
a25b6a4a77a5619725885280163547a9 
0e4a657fcf01393d494f46a031d8b5d9 
c7bdb0337acd7d942ef4beb4cebd45ed 
3d8d76358ef696ec4b6eeaf752c30f34 
af3f8e55b9dff2e53be36461f275167d 
87dbc62ad3c52481675053eddca9cce7 
35c9508fb5fc450e1532f8c6471c36e8 
a2e59d9613b8b137f9b48326c9f42c87 
7f258821c2cbbb8c4249147c4f4d1645 
2df07bda6e9532c01cfb0362b82215dd 
5f4cbbcf6150085dc19404339d7ca7d2 
ab7b3b97e95012992adebaa02068bfd7 
97c0b5a16338ac6d6fe5d698910c5ce7 
5bce1689e650b339a1c750c85e42d9e0 
0c978057e5331e099b560a7489c2eb14 
04a7007eb4e5a963048612bb891192be 
d036b4d3dfe7b240db792e144fb19da3 
2755fd0283e0d47a4f17674447225b72 
2bb7bdf9806632fbd3716af8c6ca492d 
5031b98fd9deb48a5e1ef54dd7cb603e 
87444a5fd644d39421784a3c4daafcbc 
3f7030f67161b71798891f107524dd5f 
96760d5a2b583b42b85343c10dbd952b 
59054aa76e78d399d0488918912b9107 
c40829f0908f75f1e2ed47b94d945fb8 
14098762531a2ad7e4c574889f07c2cc 
d95e54e9696a147a79d8d26a39a5fa9c 
1a3ea6ab57da07b16fbb1a870e6a8ef5 
5323158b2a8967408f13c21d128050bc 
9113e64bcfc10fc7d3dabc2cf997b91d 
3ef3f9d62745b3e25386aeb291b5618b 
5243b938dcb6be6e151f2f6f221cbf3c 
047aa4160d8dd585381afe4336319c6c 
25d572c111a50020f97acd9a6ffdc54c 
a9f53270affb6f640a98418ff9016bc3 
48d7a55f8c939101e257a021e781dda3 
d9a3509c23a45cebe8149fc3636cd097 
2873aa555594e30121cff0fb5431a44e 
ec12f7a26edda2598b62cb23195ea4c6 
b968ee20cbcb2ff39a644a4f16a338ec 
6042644532255d0e0b361eeae95b260f 
3d50d58592a17fb72e30fb612a2b1e41 
2ce10f13244168afd5d2ff25bd902413 
9d89f64e4fb4560574e4ce44f165dab5 
08543e1cab7c8f200a80455c551e6f51 
e9cd547ee698b50d8fd45326c641bb17 
ac11df1dd1d1f6c58cb86502244c4832 
9052f452029f29c05c86245ee61aeaed 
4288e69543110dec8f8ae9d80fa73076 
c2b0a4446e2a2b27ef0f8d42fd8ae468 
491df32bc6d0a2e4c6aa9b1673576a4d 
ef0ecab22a416bb2542209fa142ddb31 
1cb5db1d2a1476564b8146bbd73db438 
61ba3b84cb4efdcc02fccfd0185d93c6 
31a2abea703353b215b3dabfdb4917a4 
2935ed5a058f40651a032c657f37cbe7 
42696fcb788246eb6de4c9d987a07a4b 
5b8d64b618990400f83ef4c5502f1d3c 
5d23bbaed53a713ffa5ce3261e666b29 
d2dc05951d8963c1771dab99418c1119 
e6cc99a83ed105766b19d5c8c00f2f36 
06ac2d52407597779e8c52ad7a5614bd 
57b9e151790b96dc1d4e61fb22b95a39 
9dd3664df86614da9c06ab38297aa7ca 
0a3dc0803f667f5f6f022c397b1fdd26 
5f665b535e120fd6851ae89865c75f89 
002cda827b3450d0f1d3d6a34ea76fa2 
871c891c33cefff50438934da94a16f7 
aa682cde10ae3c3a0bd201bdf12a7645 
15f96b3acda0c303a01af3c6ae73f25a 
52a3c18718b9244125dd6359dd770039 
949c235cf064e3d8ebd3a4a878a3bd3c 
b3842c740a45c6fb0e596a126c1c6607 
b200a05c9ca428b173f9589050fb2af5 
f4121e8463dc12b0d6673550b98ecd38 
3d7a8ebd7252a65dabf8ab4626bebc4f 
370f4691eedf3f653c8068faa8f1e166 
f281cea0162a1f2653368497545e701b 
5759670014ecfda53e07d02aed5e6e7c 
3811490070833f1e9708394639329318 
3f46d9657e80236bfc257c603f69836c 
c8bdcc62d4bc7fc81fe285c0ab13729c 
5c6c5c8c31b82e023320a0ad0694dda5 
f0c87eee642a1ee0cf568792c9fc0f30 
43f028e1e161decd1cb0e1b120c10901 
9170477191788dfdffcd37b88dbc40bc 
08083d5715d15243f03cc5c1353c598a 
4026d3758de41708572211b600eb6530 
e55deb036599e711c044f18aa1759f71 
9a3a3f8f3c505635e7cd3a09c0564411 
0a6a2c45f9aeec05631325fb6467920f 
84b10be726d79bb2cdd71d07f7c536a3 
641989f1f71794377169b3946240b05f 
3d337c3eb7d27646197e6a2e14a4919b 
cd6de4a32a1ab10ec8235bcd5c3fc32a 
816771efd3340b9409c07406a3e3f24b 
c73cd335cba2947f676007e62103dd85 
2297b9b336b14dfc5e1db84f565c1190 
57fbc6aca8671b767b378ea716260542 
c5efea73dd3fce76c47c330ffb8cd05b 
fd724af805343eee08c05a68f93cf128 
0ef42051fb6bc2d2f6bec7dcfd4d9392 
6eb2b91c50222cf6b3ee7f1df90f37f8 
cc297ba758e2524a105184476bd7413b 
14848b00af25b8ffbcf6f2970fce7500 
8cd5f4eab14c14dee5def42c63b2240d 
4fe76fddd8e0cd252894844f1e6091ca 
c86629ffa8a1429a508b37f67d27d7a8 
d5820f98e836d472aeb4ffd10132d6bd 
1e777edf599bff1ee8dea70c92065250 
41bff79e4fd0c6daa004e96c9c11c485 
3afddcb4fdbb91e3fc28deef7e790ec5 
da6ea2dc4193a56018e0534cc01171f7 
00fdefd79e29c7369283af3332656b93 
3bbc85e3fc6212f33ac48af9efc27196 
f5b1ccb26b53da0a62727f6174200bc5 
b6022967515445ee20a0c004bb978b59 
85130de69e4ff5f6a1cfa3bb6430fac1 
20c7ef238b1bdab785ba09f33a812dd4 
8ff32fdfb7be5f7b4e035d2081f78ba7 
e82ccc2733df6dac19ee8dade8cb9511 
784e429ba099c9f901f370a42720dc37 
f9c201600682f0f616c16d6cf0b43aab 
491b2567749642f6052b1bdc3287bb78 
c1292baf06e7511576f0a5832aacf545 
e75e9212387c5ec173f8601301760684 
37a90bd32f7b1bbef1fea21401f1ad24 
e6bd9206ee046e0d28918c82a0c91d99 
03a7ca2e19fa5b58f67bf14067c52327 
73854da12608f8302f30f56d7b209336 
8c467c1e1b07005fa90d64e660050ad8 
b4f869313f5bc50a2c019ad521d47b72 
a363b0b79468236bdecdd980ac00125e 
43b43edc1d7e6831b16a03f9da2b8d96 
ddec94af34c3158505bbdd2ebb189b9e 
df1112cc54accf94cfb26d0261630358 
b5f1ae0ec68bf06a275fbe1291ea0c2e 
61cdaa95e9db878b0e9db5e17720f6a8 
822a653ea09d61f56f082e04a1ed2faf 
f6471f3d3b21a7f4b7e95e95c208fbf2 
91e14ba49b8c4840cbad12fbb4cd7099 
82884f59a914140f0d23b22629fe0aaa 
ed9067ef569e62197507d9d9994d143f 
8f0fb458e07fd80446e4e5fb4eb7fe8b 
13eb60cc50a2d7a6d24b5f4b837a8678 
c7b17e0181331d4c9744b319f545eccb 
816465404e3a4dff66ff1339106867f2 
316276a3ac2887592b2f2d7f7a501504 
42e8b6c6be3e6d18122b72fe30887175 
457a4664da261e39ace77004d649f0df 
558c5bf012e73600af37e56aceb7e259 
ad0da02a42e60bc3a8bb8601349be6c1 
fd7192ab090d2586e68dfcebd5306148 
55d07c30c9f7d218e675f576ab34d8cb 
7fec64541cbf284f833bd154b2246d9f 
b2d32e674fac57cd4c0315484e985b5e 
9d82282365eb193a137ee681c8f8fbf3 
85b40332cbbed235d53f81d49ea9b7eb 
4d1f8391b6ac1a9bccfc44a9488c8f99 
528114fbe2e88cd77f16effeedf36aa2 
a26b1bbf7509cf85dca2c5792c9bbbb9 
5b11d1ffe46b81222f4100c88aff2fe9 
4f5cfe072380f58b5855baebba2e406a 
b42771fafaf981784756edb624c8db57 
de08bc462b82b4758931787783be41e9 
6d717622bcae87c92fd33c344416c1d3 
007896bf7d52c61bd988a95c17f9fea8 
66e0033c779b76d79ad48eddf7f9bda0 
31b9ff8465b9e62af12449c308f0a02f 
c4a30a5e9cfa7f8d7d8df42d2b0b0356 
3a7d8b7d3941924b7466c6edf584b3b0 
ce60fc1cb8989f6b6886acd67b2b7a1f 
a499358d9d77e2dfd4d2f8ad63ca4523 
a0c0b4a085ac5cdfa96e457e5e00f37f 
ec6da3d305b61660c9dba94c4ce886b6 
9201bc6beb41b0683cf63691d49d3837 
0e33d682db46d30261fbeb6e2cf0845d 
79a104c19c8891c7c2a544f84bf0f668 
4c176e951714130b3ec4425d1f2dca2c 
de97faeb43a2ffccb44c688b006d2977 
ca8cc0d449d8b0daf982e22c7e9e0cfb 
a05515d2cbc2582e505fc33d41258ccb 
28a6f6a267248edc68b8e74d8d974085 
b9612462fa3d6978be37d0598505fbba 
00081e822298da0a555fb9a58790e3b9 
2a062994adb184e996a255c20cfc8726 
cae051df0091ec8143995a3aa64ae295 
de71e949e1e819742fd88ddb0441f3de 
252edff4a08368a3b9b416949767022e 
d24bf4921daf568b99f231a0e24e7ea5 
318ace75f08c59a8b4ffc3d381690126 
ba547ab80d7b66f53b3fccf28b32ac89 
5b2f40a7d8b2cd9ae15ac5e57f40f5c3 
115027b61d1c8e25ddff453d201ff60b 
91ba848e8a14268bf0fdbfd2f882bf6e 
1d5ff8082bb0562b287dec85efbd4c7e 
c7027a805544d31c93c2fcee2852ce5b 
a9fbd624720867693c22d620d0d8580d 
3132bf1a5560fc82cd866cdfd9825848 
407b58a424badcbf9729a989e01f04dd 
9beffb7eb3c0208e4d967bb3e87a0522 
dd5d1fd3d5c6aa14906e0bece7f90ff4 
de63e7d3958a246433c0c2ced55429e0 
8df47d7fbf9746fe60d2d06f1be1d202 
d5ad9512f8a2acc3ff9b012abccfe72f 
d89851f152f269e4e640805eb3fdf99a 
3db40b028d1e2962fca32d0e9c998990 
8cc1d7dd332fb8433a06d461ec64c6ba 
9b866fb50921c451d6ae99f4606012c1 
b3f731fdb695c926140bbd8edb2e5155 
1ad34abc61d840d7d21f4467e5cff853 
e8f44d6af74b86c3f36622d321066c14 
54d953f74e550d4d2854d901575e1692 
ba2a0891020b5d71ba56e22bc96e0d74 
02f3d54be8df81fc9811fc09ca8e2906 
a935778b4f3480fed6162e24d8e7e95f 
84c24cf52a9264262730421159ade58c 
cb005753c1659dfc47136ea7b3926611 
2318c610a99fbf3d3c5022bba1442e40 
c72a78cae873e651d0b89a1879611ebd 
608fd0b1d81b3b449a29e7a0b14adb20 
5b5aa454d2f05f2c138da98835adb328 
56b135af58ae8262b91fc99660229bb6 
b488deca06977e6670157cca66f0a986 
95237e0fd11bea3725209b57005cd5eb 
31084b108b8c9a7c22c877a569f3fb85 
176be2eb458d7595d349bbcacf4195f9 
27caaf89d9a74d04dffa73ce064363b3 
ecfc11ec98db89bda27f863c6fab833a 
8bc7e83993d5b9056f525e7d7aa783b6 
5d968fb3c4cbf1d58bd3ddc284094bb4 
42d029ca9cca44cd18191be6e7c82a44 
2fc8bb77273c9d98f094ceb0f9fdc7bf 
70cd515c3f0540bab846a5bcbc63e88e 
f128b50fb853a5d1fa5af9c9db13d938 
f09382793305f4d67f642e68b11e818f 
a656ab174db63d95f513adadac906a1d 
568a62ab6a40cb422667dcf78cfd9a97 
2e28c7dff75e530be8230c366d142ac1 
07ecbc2f6855ef4b554dc69ebf4dd53b 
9dde70699b366c886b57a399a42b193d 
7471d39dff051d0ac8b6f2817fc2b740 
2ed43cafc40913bd0e95f2281c5d5719 
3d814106594f6636cb9ff69bcdf58927 
3b973922e76200995f9aa95ff33d2e55 
1c39ee7892194ff8576e0df1b98ff0b3 
1ff48832affbb70d17332e13d1242a01 
cb394675ce52837fa9d1d39ed81079f8 
64d06cddcab96366aa9bd4301e64624e 
a30983eb4f35693c0ed52fb9f2356094 
0e5593eba091055b6b0935e0c6fc37a8 
42b23f08066c8ac9f4ee62e4ee3a7553 
f370702d82e32cb3d10733c3cb5f2521 
9545015a543b124dea1a46339b15807d 
5d9e742b3c27b3db242a7374e4209cab 
a57ebf30cb60adbd0b444ecbdf7e7d15 
05747f4aea5fc91071b76abfb3acd395 
76672f9d0fe7a54d4139623c7385ea68 
f9932431d39a0aafce9500d22ac207de 
cf99f0838972486677e206982be8695b 
cc52d27348bae7e2f9a4343c1b4f517a 
39643202548578b8dfc4404783685e99 
5c8f50c8722906ee9099f287813d87e3 
59c74b6d1060494d81a1e3a2d139eaf7 
b0eb494067769ada4dadcb709e349202 
4ae1dbdfd791576107b4be9b78a4eb8e 
3eeaef4589d6e436f8a8d464d834faf9 
2dac5d994cd1600ab8b2fbec98edd539 
58a439b97f10bd94a658b27d094be321 
858f14debcd804989fee535c470dc564 
3b57535293816ebd0da7a38835ff5c86 
6ad23a838f88aa1589fe399458f1d4d3 
a8a1f20b19506e9750d29c0c7e3fe9e9 
bb40abee74413ba6a1e9f0c113477bd3 
1be4b2230eec23c139858e45940983ad 
705d846b7657ce5dd9888da39601a164 
ee9b741a7af1a6446d89727e8f898e6c 
d586dd98c836a88a7f3f634c0070a88e 
35986d2a176b65abacfbe53191c6daba 
34554947e4e1b0de1dc4f080098232d9 
e4871af7205a66d9a189adb600aa4c02 
f929de61c09bf02e9281e908a8f6bbd4 
a76a575c719c2fe4fe6ef259eff6bea0 
4d6a965c11d8f00b96dfd24630a49119 
114e9525b909677e39a803f529a010e1 
06e1c178cf93c594cd4d1b8917fa6f01 
15175fba447f095cc34008d92fbd1fb7 
4f5c13b8f3769a6c6083c72ed38663d6 
03b8063741ddb6f7f9cb9a2e0abdeb53 
bc3aeeaf5579a391f8b26bfaaf1c5349 
dfc6bf8ffcb3807669da08d9a39c7031 
e54e01af7978ff3918fe49039914d215 
2eaefbec06ed15c1c804bf394aab8013 
41d9f7c566d748b160fcf41502be2d6b 
b79aeccd625ce77574f03d85c23253b1 
9b14a446c2f34231d6c79c9ba9e7fcb5 
9af30e3b5c64bd752afddb3255d70b8d 
82a1481c5c297258b1a16156a1f9b38e 
2d9a753c919e6c88d3424eb18cf7324c 
562943aa05e26299c26951566649fbb5 
c4df741b261bd2f3963d09de3b40f44e 
8da03b871e487646ef8d774623723892 
6ef64f6fc625735220a0563476de017a 
9cf5e770f69b10d86adc838432045622 
8e4ec832d5dc709600417c78062093f8 
eb38764237cff73fce962c152437d13a 
27d6b23b7ba1bbb5a40627832e3b3df0 
459b29ca37dd46361648196504de50fa 
d18c05f00961da6dcbc0f0298d457834 
88b04ba620ff5c28ea8220d616d8c2d2 
4e7062cb9858674419440712c3ea891c 
511c28140def3db55af324f138bd4492 
917e04e3868e861f8ea3f910b47e5461 
ca93149871a60670dce63d577aa7cd65 
87f3a4208a068a0276a958e03673e34e 
166e486d3028a27363c8b78858ebdb58 
b5c05b8bfb9fe8c7851da73cda67fef9 
3144ac901ae87e617e97afe9cae87ee2 
fc3bafb81cd2f5b7fc192083be2f37d4 
272867465aa53183cbe88453f109ce6e 
f6509d00c20bfdc3c74c4f4689ad7f92 
42a6bd1c616ccd414c80910eb057b986 
04d39313e6242a44e6a629b15a6c6016 
3c46908d8480cfc8c637459c8c5dc504 
fb69967a2dab6280eac33c143cef625d 
b5117702e59bd3596675e29d24bc4fdb 
e2d4bb6388111a61a0ff1f784d9650bd 
12412749d1c0b173e846634a427791ca 
42ccc3ad2f8a0af0fd13661a43b6c556 
46f3e3600fa3df568e6b0d2d76421685 
9ee113008c33c5b2603dd4fbbd05f491 
78b3db99ee562d94c90f3a5700751f97 
638345673f04059a0d769e1d5359343d 
9165bec52a46732998d44d718ca6f625 
aef464820c6ac1187e740f691335ef72 
f597ae3ab2dcb8a874d800c477df02aa 
b4c06a12d7fecfa7dfde9849a41f9dab 
8674585b771466dda5f0b59bf2c1d679 
fcfc9ca5911c7ef32be8f146be6c3d5f 
e794148921aa9b1358a40725803b847e 
da0ee693e488ab140f7998ed5356957b 
3f7c1bb3a213c7081d467af7a5ccd4a9 
acaffe3bf8aa6371f5e588c7d69aa3f4 
a44b5ae8855f4f87b628afb827038cc2 
af4155347bd928566242b69429e87858 
9e8575dd2ecadd3a585abcf8ac0d762b 
005b1f7a0c83633656e6e9e99b5eb5b3 
525c3022a1a107699c13a316bbcdcb48 
7b2291782b76d9c34d3762955d686dac 
9391f0521cdf25d4f814dea6a2915aa0 
6c20806889bd28326cd0ac19419ed56a 
2ef98dbb5635211551b74931583420d7 
057843290e838f450e14a2c3940c63d0 
7780b9cf32e6503a8ef3ebbf5b433862 
3606e9e51ed4821f6474d41dd1017fdf 
4a312874600d0d04af8972970515a498 
41fa052129b217ce594ccc303501d1d3 
0eb45dcff0f6af2afe297afedd3208a5 
f40aff9e1720de497bb89701924c7b8b 
230395431de721761c7d2168d9dfb72b 
e47650cd2837c0cddf79b614e58860db 
6fb687c1a18b7a6d63ca4fecd2a269a9 
2d8a8a65c6db972f789375f621f3115f 
7a72cedc966436126c4674bde4367b37 
6905f71c5bf83a4738bab473f18f9732 
f546088452e331dd7304216e7a1abfb2 
84277e0ef8e3d6d8ac9c8d812e66aede 
aadec17c01e49f2acb334342b355f003 
9bdb3b17d33eaaf24ac9c71a5292b422 
50de3ec36b61958818eab32a4f72598b 
f3e5e94d6eea51a255854df70d6a52d9 
a0d90e86533901ea7fc730d25bc4a7bf 
d8c31c7345753fd51ecb5f7bce7ba60f 
48f738245691ae744aae7700013f8d06 
b5f47ac29e92d98cd0a4ab58114c2c12 
a8f873f979f5426df9135e97c2568f63 
9bfa5a4fabbe0c62b22dff3db6fb9f4a 
e839c25c1603720fa19f69cd47afc536 
add5faf22be4121085c2a9012d3fa136 
139c7eeec3d40721c54239ae099f9603 
8809b71ce18f6460ccccdb2d0a673fe6 
9b6cf06255bcc16d4a7d3ae79ccd626e 
20f417a87352679d3508f4c2d431ee1b 
0699b03eb3aa8b81dca3d143a768700f 
79d603918022518a1d4295a6831b3077 
fb1255d6c10ecef99838d95d9633cde6 
c4c8621c7ebcb4a66a5490814eae5aad 
9af30c9f4e178650cf039214fad956c8 
41a689647e49b28a7c460c65c1fdae41 
472cb08c4e2b3899c8eb1c97368eebad 
db5b6a72207b3cb13a49d22526c00961 
2779ad4ba74c1984f3b3207d8135078f 
e6430b971257a98345eaf3b3f332951d 
4fe890e577c3ecf81c0ee8f37acd0c8f 
9fc73b6093be553058ccd1cfb7f23af6 
e1690a0ba53b4f3acdecc37e8cd7fbf8 
95ee4b8351f7d99a1a56bf658317607a 
c74b9a93da19b1796cd802604754b853 
948f7ff244b763bfc32885f727d3b73b 
51de2a8da5c963056b88e75141713c3a 
a9cf411b621921cce5695cb52bed8599 
4f973b946437d41b6336c604ef000101 
da8cedeb3d7d0292643e36ef2504cf2d 
92dc2da3c9b3b304387ce6f567538634 
c84c89bd35ded776389513488ef6e5e0 
d7364ff8c08c1ece13f25901f28386f8 
879498e7ac1ba3de6c521de282da44ea 
00d10776236d6f3bf9089e82fda88039 
39aaad3b14fd3f83a1da92cd49e29031 
d1c49ac929a081ac28cc8839020847e6 
e6897dc5cd6dc057fc0a3e4d0467d205 
a7f662203934c8f928d2b000511aa393 
df8d64ad298f044c1355ad09dac5646c 
9279d14f3a991b76b828a8c6a45a45b3 
70f1ba1cfb63c5edf2c64241c31de9f5 
00a3dea5a6d3e18bc19c1c3e3d619858 
4afbac915aed1b93371f323b9c7dd2ec 
911adf811ee5cf1e9f3fc350bc074dc3 
72fd0abb392f44636c32f2925979e414 
49590de03d423a933b85d1ddf3f628d2 
52a34e557ed1cc0fe4f3662b9f542393 
d48fe71da7d3b47c0efe154e1fbe5fb2 
6d977c7360dfd65f43af8ce107d5bca9 
602c1f3f5cb51aa0401688fe96f0c444 
24c73d07c6569ca87ae04672cdbeed64 
327efa1b74a24acb13aef660ab6beed8 
b3edb9cb245072964e530cfc38de8c3b 
7b0acb29342168fd949498ddf117b6f2 
75408369cbf017dd8a963813f1b6f6bb 
248cc9cfbe9e1bf579c564930823e5b1 
01149d22df9f583285de428fbecf6690 
5e50e73cbcad467ed783acddea97174e 
12b76e4fb9711c6f3e4dd0740ac9e51a 
a8817fceacc4993329b7676ff8ac5843 
0027e265b30e934053014f36b48e9076 
bd797178eab0946f8c0fa7f0ac9a89ad 
f1094aeff9a6c93f0ae41f3a9a4d5472 
4404e576c267ad8de4ac2f0597c8a1a6 
f772ec75b65cb4c00abebff8fb97a4d3 
74d166b89e1217aafc548b29d55c7ca8 
f7a30a33155129bed55f6bdedcd04b9b 
2e69ce95baa741571b708e6f7c9494e9 
6c42d084da7dc001d87ec03c34c410b8 
d62d60c9ba62ad4e413a524e0b8b27f4 
fd3f10886429f20f577dc85a30f06eaf 
0fea5f8cd62bddca9e3584f2827c54c6 
9276c9243908aacec3a5ba2689387f71 
dce31e39d9fd7cf37adf147ae8e2a619 
700295ad48bb597edcc83a10c775ac56 
6bd9cc26459d0ffc20f7cc4626c85290 
a4c746d00ea73b5c47a296961cfc2784 
8674c31db5d484392772a635ae01e28e 
0054a9a29953d1b491d1bd5f537ba2e8 
bdd991b26096a193ba7ece1b8c5ce79e 
054b3026f72519a5b8c54b7638d49e3f 
98ed972bebdfd0932678c06e6dc51d39 
e478bade4f690a0516a49872fd010add 
2b6c337dff158528d7bbdcc37f041ba7 
440449877f956ef7cb13ba6e893ed4cd 
436453664ea4d179fb2f7d237438976b 
30a3a55298d3bb4a14bddc06f35b1c95 
468e7dc5bfae3295d3f02002d16b8b0b 
edf615feafb7cb8eda8616dcb15a0a41 
844ddcd4c84eda99a96e49151b131366 
1a674712c33d55320cfb65bdab8e4abc 
e4d55da5a7526e8e5910ca9bb1f09d9e 
664ce07ce0806cc4bb72c808fbff2483 
b87fc544099b5a4c20415cd1b42d5d20 
ba796753a23683715e1e89cc1c6fed36 
7e053d4a6ab83a50bc4bf382a4bda915 
be0183642c8799663786caf0fa5d502a 
e64ae1f3c548a92e58facf2b7dd4dca0 
7b68b9140d039d47a35017b322148d3b 
6b74feffca36b6cfad930fd2af71d34b 
aab00a56fed3254b887ef896eaffb3bb 
93453ee34123695770fb4bbedca236df 
1e06985187d1e7f232634d1c7ee2bec6 
27e2588946d39fe04b51cd201e2f9152 
4bcce7e56be97e3400b7f370f1660c55 
19c81cf430aee2fbfacbe7a6384819cd 
e3d20dc4fffa8b5062a296001e08a235 
ce03bc7f8af48ce6226d8e9a71fc5aba 
5085e489c5230841e3e214c557a233bd 
557a92b32981e2f2a19de55c6b6ea0ed 
18c9eccb3a00a98ee1a8c452f79f05a0 
3daccb2feb8ed6f173058c6e3ab23f45 
134a3073c0502a06cdb04829747f3305 
5ef9a1320208e3f1c6623e40407c8d27 
c35279aef973a03284cff1bd762b8b9a 
b9a286a301602c87c4ac0b4b98040c6c 
27dd10585ea0948b952a126e8b34ab72 
ee554464253a48c8af587b2ab702645a 
9de5fd3a4c52e8d337ad9b86cc24a932 
24d8b3209463ee8eba489770c3f580f0 
e8305abca2dd2f1422e1e7f07fb4a2db 
58411754e59345fdf680bfbedd08d5fa 
c66f2b7c455758920d01842abe059f84 
ab6d06aec22d218f5df4b8d1b6d2c8d7 
52c914003ea87a1efd1e07419ef3c3d0 
4de37e59e31c65a112b34a5f3fc82570 
9207f3e37d6f8cfc6af616dd353c22f2 
e875a8ab16463b1933b3d06d139e8180 
2d362affcfc859f84271a988df3c96cb 
2ed9f6a2b0227ccfc3b0a43411e4041c 
e3b1f5cfbbe8ac52c311726214e5307b 
ef0e5cbedf3e61f1e296e4d57dbf5729 
4577e6c4b57e20709d4a01be325cc0a3 
5f4dc40afc460f8839bf5cc6d5b5e310 
3a7f3a830d1d3d564358538952b52595 
5c14508642f9edee87f7c8d63bc36195 
6f75cd30e454ecbaa770dc08239cdc91 
a7a10b3346c971f32c59db182ca75515 
6d1b0a51bafcd377694bc9177b6d3ecb 
30132327fc174c02f753ad0aad608834 
e0212dbee2ab91bfa6072c573a7e3c3f 
7eb787158bcf5b61c35ec929408c26a7 
5f13569dc9c412af7babc5389ae0ff6d 
5785b073f7a9a4a26d37a4f53ab8faa7 
9022e47f474dc8d28164e6652de03bce 
4a13d4727f95f2e3d15497d2d54d9833 
f870bffc7ef559299fa739f1b233fda4 
43387310234b59fb1e42368693a986a4 
49295537aac2724ea2c4ecac09c0fa35 
2c5756ee5b617bffb312df8da3b015a8 
2c9b56d2be1da47e3a306bf34eddc1b4 
d3612f8eb9aec47f8218a982c0028ec3 
d032e35d2b130cc051e383d7540d417a 
eae7392f84e4625eb69f11e7bd04586a 
2cc840b0bc21a6171b6110d2efa93585 
b966ff55856a9578f6b6e7b2a191d0e8 
d8ed28bb610542bc170dafcfc2161a57 
e7e1a9a132ac0be81f291fdb61247f64 
58f1ef29644e61ebb39933ec7a7e4e9c 
5b56e126613b5391a1ebdac695562722 
9a963b913b37048b87373280c6dd4dba 
69a2d21c2aaa0372331602f0059f0235 
c57775d61f95cf76ab65e9ed07c33a3a 
ba6a9937e0e7af4fa040422d8563b01a 
ecd251df91aacd13cca6da3e5fecda4e 
e3822ed61c9fad11d50d562f657e4054 
c36ffaf0d245dcfe0e5255b168cec3a5 
ed41afe3643022a9ee3a50417ea2d63d 
3efb48bd3f16ee101dfba728899c0faf 
32cf75f20d8ec6ae84814f5b520c10e4 
b7f95bf7a037791c7a25aba0a9ac4e43 
58b2c120f3e089774b765651ab7c0609 
4ec3907412cb6ebb9bd37a577a31900a 
8a9e3c5b7583bc4fb2bdec0077e86f8d 
eb623ea38b92f096166bdb466f14fa02 
52852632b263c2d65cc774da03b4d89c 
78f6207184e68e7af6c4c8eb9d96fe23 
5a5bbb12bfbbab9b0a926f75978f4f70 
e1f200018dfb9884a23329a8a75a0738 
091666c170f4e5a3e5e570f685149e4d 
857100c2f1cb4ece0b718235188978fc 
2a426f1f69ef952fed4b887b80f33f4d 
eb7011445c9954b5172f93da063e0a98 
648e454b4fbb8ea7d7a8b1b1e5b97c39 
d1487d99546d1a02c5147cdc2c35bc52 
eead5b5680df5cd2ae9f7e51e5aa7676 
1077846c4cef664ff7d760d990682faf 
59c3a8886f40d29d41faa3b652e88744 
51220d65a8ddace7bf2efb50332abbb5 
e8b903fc3c5338de1028c5929fe95c6e 
c4a0643ba086d898298ffaf045a0745c 
369400c08293c8f8ccfe14282080811b 
f357bdf68f275410426b9cd18e4189ab 
a027b1d1ea7daadfdc8f50f8a42a611e 
1fc713df3b37beca44ee08aab8195cac 
74e9099aa4ee4a68ced3920c0e32fdd8 
5b0e073ac3f439e70b64811961383350 
5530985a262cf47c0fa4e0b5243c3f27 
0a211d5e6c9e4dc5ac38e2d4c900dc6e 
178a83c20b44a96161aee291b85887ad 
58e17dacfe53a3bf1f99a0e4a90ab659 
fa566ad1ae7733dc7abc85920aeb4533 
6a6173c69e67379d360b7d63443e34e9 
4e327d9dcf38b1f111669e4ebe9592d9 
19b029cf6ef84f28aebcd2b14f23c1bd 
07b512634e50c9f58036116cbcdadef9 
d892e929e017421f25df99b8cfe81893 
1cb7ff69866f42f2bfb12b83b4ec9d38 
6278a514204ebd2d28abfe61c3a8e07e 
760abb634f57c3a58228a87339db4e7d
8568201741501e8fcae8790e41bb4d19
b44c2e71843254542024007a6058a291
dc11fc1ca46b508c1fe0b29e9ba588f3
70fcba6039820f5666dc3b04112087f0
b4d623bf16592c0acdf781624f5d0a75
e79480d26dffb2134aba8a5eff57f6a8
I am curious to see if this built-in function (0 < x < 1 in double precission) is enough good or not.

Regards from Spain.

Ajedrecista.
mar
Posts: 2554
Joined: Fri Nov 26, 2010 2:00 pm
Location: Czech Republic
Full name: Martin Sedlak

Re: The Great Battle of the Hash Codes

Post by mar »

Here's my entry:

Code: Select all

#include <stdio.h>

#ifdef _MSC_VER
typedef unsigned __int64 ULong;
typedef unsigned __int32 UInt;
#else
#	include <stdint.h>
typedef uint64_t ULong;
typedef uint32_t UInt;
#endif

struct PRNG &#123;
	ULong keys&#91;3&#93;;
&#125;;

ULong Rotate&#40; ULong u, UInt v ) &#123;
	return &#40;u >> v&#41; | &#40;u << &#40;64-v&#41;);
&#125;

ULong Next&#40; struct PRNG *p )
&#123;
	p->keys&#91;0&#93; ^= Rotate&#40; p->keys&#91;1&#93; ^ p->keys&#91;2&#93;, 3 );
	p->keys&#91;1&#93; -= Rotate&#40; p->keys&#91;2&#93; - p->keys&#91;0&#93;, 7 );
	p->keys&#91;2&#93; ^= Rotate&#40; p->keys&#91;0&#93; + p->keys&#91;1&#93;, 5 );
	p->keys&#91;2&#93; += 0x8ae4f6c1u;
	return p->keys&#91;0&#93;;
&#125;

void Seed&#40; ULong val, struct PRNG *p )
&#123;
	UInt i;
	p->keys&#91;0&#93; = p->keys&#91;1&#93; = p->keys&#91;2&#93; = val;
	for ( i=0; i<64; i++ ) &#123;
		Next&#40; p );
	&#125;
&#125;

void DumpHex&#40; ULong u, FILE *f )
&#123;
	UInt i;
	const char *hexc = "0123456789abcdef";
	for ( i=0; i<16; i++) &#123;
		fprintf&#40;f, "%c", hexc&#91;&#40;u >> 60&#41; & 15&#93;);
		u <<= 4;
	&#125;
&#125;

int main&#40;)
&#123;
	FILE *f;
	struct PRNG p;
	ULong u;
	UInt i;

	u = (&#40;ULong&#41;0xa8b2c9d0u << 32&#41; | 0xe3f54671u;
	Seed&#40; u, &p );
	f = fopen&#40;"new_hash.txt", "wt");
	for ( i=0; i<824; i++ ) &#123;
		ULong res0, res1;
		res0 = Next&#40; &p );
		res1 = Next&#40; &p );
		DumpHex&#40; res0, f );
		DumpHex&#40; res1, f );
		fprintf&#40;f, "\n");
	&#125;
	fclose&#40;f&#41;;
	return 0;
&#125;
Data: http://www.crabaware.com/Random/new_hash.txt
mar
Posts: 2554
Joined: Fri Nov 26, 2010 2:00 pm
Location: Czech Republic
Full name: Martin Sedlak

Re: The Great Battle of the Hash Codes

Post by mar »

My second entry using only 16 bytes internal state, 2 rotations and zero seed:
(both entries are public domain of course)

Code: Select all

#include <stdio.h>

#ifdef _MSC_VER
typedef unsigned __int64 ULong;
typedef unsigned __int32 UInt;
#else
#	include <stdint.h>
typedef uint64_t ULong;
typedef uint32_t UInt;
#endif

struct PRNG &#123;
	ULong keys&#91;2&#93;;
&#125;;

ULong Rotate&#40; ULong u, UInt v ) &#123;
	return &#40;u >> v&#41; | &#40;u << &#40;64-v&#41;);
&#125;

ULong Next&#40; struct PRNG *p )
&#123;
	p->keys&#91;0&#93; -= Rotate&#40; p->keys&#91;1&#93; - 0xbae357f1u, 3 );
	return p->keys&#91;1&#93; -= Rotate&#40; p->keys&#91;0&#93; - 0x91ac73efu, 5&#41;;
&#125;

void Seed&#40; ULong val, struct PRNG *p )
&#123;
	UInt i;
	p->keys&#91;0&#93; = p->keys&#91;1&#93; = val;
	for ( i=0; i<64; i++ ) &#123;
		Next&#40; p );
	&#125;
&#125;

void DumpHex&#40; ULong u, FILE *f )
&#123;
	UInt i;
	const char *hexc = "0123456789abcdef";
	for ( i=0; i<16; i++) &#123;
		fprintf&#40;f, "%c", hexc&#91;&#40;u >> 60&#41; & 15&#93;);
		u <<= 4;
	&#125;
&#125;

int main&#40;)
&#123;
	FILE *f;
	struct PRNG p;
	UInt i;

	Seed&#40; 0, &p );
	f = fopen&#40;"new_hash2.txt", "w");
	for ( i=0; i<824; i++ ) &#123;
		ULong res0, res1;
		res0 = Next&#40; &p );
		res1 = Next&#40; &p );
		DumpHex&#40; res0, f );
		DumpHex&#40; res1, f );
		fprintf&#40;f, "\n");
	&#125;
	fclose&#40;f&#41;;
	return 0;
&#125;
Data: http://www.crabaware.com/Random/new_hash2.txt
mar
Posts: 2554
Joined: Fri Nov 26, 2010 2:00 pm
Location: Czech Republic
Full name: Martin Sedlak

Re: The Great Battle of the Hash Codes

Post by mar »

Hmm the second entry produces rather poor output (fails eyeball test)...
mar
Posts: 2554
Joined: Fri Nov 26, 2010 2:00 pm
Location: Czech Republic
Full name: Martin Sedlak

Re: The Great Battle of the Hash Codes

Post by mar »

Ok, this is my final attempt #3 (public domain), passes all dieharder tests:
Please ignore previous entries.

Code: Select all

#include <stdio.h>

#ifdef _MSC_VER
typedef unsigned __int64 ULong;
typedef unsigned __int32 UInt;
#else
#	include <stdint.h>
typedef uint64_t ULong;
typedef uint32_t UInt;
#endif

struct PRNG &#123;
	ULong keys&#91;2&#93;;
&#125;;

ULong Rotate&#40; ULong u, UInt v ) &#123;
	return &#40;u >> v&#41; | &#40;u << &#40;64-v&#41;);
&#125;

static const ULong C0 = 0xbae357f1u ^ (&#40;ULong&#41;0x1fac0934u<<32&#41;;
static const ULong C1 = 0x91ac73efu ^ (&#40;ULong&#41;0x7f901d53u<<32&#41;;

ULong Next&#40; struct PRNG *p )
&#123;
	p->keys&#91;0&#93; ^= Rotate&#40; p->keys&#91;1&#93; ^ C0, 3 );
	return p->keys&#91;1&#93; -= Rotate&#40; p->keys&#91;0&#93; ^ C1, 5 );
&#125;

void Seed&#40; ULong val, struct PRNG *p )
&#123;

	UInt i;
	p->keys&#91;0&#93; = p->keys&#91;1&#93; = val;
	for ( i=0; i<64; i++ ) &#123;
		Next&#40; p );
	&#125;
&#125;

void DumpHex&#40; ULong u, FILE *f )
&#123;
	UInt i;
	const char *hexc = "0123456789abcdef";
	for ( i=0; i<16; i++) &#123;
		fprintf&#40;f, "%c", hexc&#91;&#40;u >> 60&#41; & 15&#93;);
		u <<= 4;
	&#125;
&#125;

int main&#40;)
&#123;
	FILE *f;
	struct PRNG p;
	UInt i;

	Seed&#40; 0, &p );
	f = fopen&#40;"new_hash3.txt", "w");
	for ( i=0; i<824; i++ ) &#123;
		ULong res0, res1;
		res0 = Next&#40; &p );
		res1 = Next&#40; &p );
		DumpHex&#40; res0, f );
		DumpHex&#40; res1, f );
		fprintf&#40;f, "\n");
	&#125;
	fclose&#40;f&#41;;
	return 0;
&#125;
Data: http://www.crabaware.com/Random/new_hash3.txt
User avatar
sje
Posts: 4675
Joined: Mon Mar 13, 2006 7:43 pm

Re: Are they good enough?

Post by sje »

I changed Oscar's PRNG slightly to speed it up and to fill bits from right to left.

Code: Select all

static const char CvOrdinalToPrime&#91;PrimeLen&#93; =
&#123;
  2, 3, 5, 7, 11, 13, 17, 19
&#125;;

static ui CalcHashBit&#40;const ui64 bitordinal&#41;
&#123;
  // This routine calculates the nth pseudorandom hash bit.

  ui xorsum = 0, index;

  for &#40;index = 0; index < PrimeLen; index++)
    xorsum ^= &#40;bitordinal % CvOrdinalToPrime&#91;index&#93;);
  return xorsum & 1;
&#125;

static ui64 CalcHashQwrd&#40;const ui64 qwrdordinal&#41;
&#123;
  // This routine calculates the nth pseudorandom hash quad word.

  ui64 result = 0;
  ui index;

  for &#40;index = 0; index < QwrdBitsLen; index++)
    if &#40;CalcHashBit&#40;&#40;qwrdordinal * QwrdBitsLen&#41; + index&#41;)
      result |= BXL&#40;index&#41;;
  return result;
&#125;

static void HashAssign&#40;Hash * const hashptr, ui64 * const ordinalptr&#41;
&#123;
  // This routine assigns a pseudorandom value to the given hash object.

  hashptr->qwrd0 = CalcHashQwrd&#40;(*ordinalptr&#41;++);
  hashptr->qwrd1 = CalcHashQwrd&#40;(*ordinalptr&#41;++);
&#125;
Printing:

Code: Select all

static void HashPrint&#40;const Hash * const hashptr&#41;
&#123;
  // This routine prints the given hash object.

  fprintf&#40;stdout, "%016llx%016llx\n", hashptr->qwrd0, hashptr->qwrd1&#41;;
&#125;
https://dl.dropboxusercontent.com/u/316 ... /HashCodes
User avatar
sje
Posts: 4675
Joined: Mon Mar 13, 2006 7:43 pm

With the perft() throughput test position

Post by sje »

Using a test position representative of the early middlegame:

Code: Select all

gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 1
Utilization&#58; 0.000000
46   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 2
Utilization&#58; 0.000000
2079   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 3
Utilization&#58; 0.000003
89890   0.15 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 4
Utilization&#58; 0.000127
3894594   5.16 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 5
Utilization&#58; 0.003070
164075551   56.70 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 6
Utilization&#58; 0.072267
6923051137   130.26 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 7
Utilization&#58; 0.804941
287188994746   282.06 MHz
User avatar
sje
Posts: 4675
Joined: Mon Mar 13, 2006 7:43 pm

With hash codes from Martin

Post by sje »

With hash codes from Martin:

https://dl.dropboxusercontent.com/u/316 ... odesMartin

Code: Select all

gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 1
Utilization&#58; 0.000000
46   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 2
Utilization&#58; 0.000000
2079   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 3
Utilization&#58; 0.000003
89890   0.15 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 4
Utilization&#58; 0.000127
3894594   5.19 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 5
Utilization&#58; 0.003070
164075551   56.84 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 6
Utilization&#58; 0.072271
6923051137   130.25 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 7
Utilization&#58; 0.803738
287188994746   278.79 MHz
No significant differences in utilization coefficients.
User avatar
sje
Posts: 4675
Joined: Mon Mar 13, 2006 7:43 pm

With hash codes from Jesús

Post by sje »

With hash codes from Jesús:

https://dl.dropboxusercontent.com/u/316 ... CodesJesus

Code: Select all

gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 1
Utilization&#58; 0.000000
46   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 2
Utilization&#58; 0.000000
2079   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 3
Utilization&#58; 0.000003
89890   0.15 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 4
Utilization&#58; 0.000127
3894594   5.58 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 5
Utilization&#58; 0.003070
164075551   56.85 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 6
Utilization&#58; 0.072245
6923051137   130.46 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 7
Utilization&#58; 0.803642
287188994746   278.40 MHz
No significant differences in utilization coefficients.
User avatar
sje
Posts: 4675
Joined: Mon Mar 13, 2006 7:43 pm

With hash codes from /dev/urandom

Post by sje »

With hash codes from /dev/urandom:

Code: Select all

hexdump -v -e "\"%08x%08x%08x%08x\n\"" /dev/urandom | head -824 >HashCodesUrandom
https://dl.dropboxusercontent.com/u/316 ... desUrandom

Code: Select all

gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 1
Utilization&#58; 0.000000
46   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 2
Utilization&#58; 0.000000
2079   0.00 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 3
Utilization&#58; 0.000003
89890   0.15 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 4
Utilization&#58; 0.000127
3894594   5.39 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 5
Utilization&#58; 0.003070
164075551   56.34 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 6
Utilization&#58; 0.072268
6923051137   128.73 MHz
gail&#58;tmp sje$ ./operft "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10" 7
Utilization&#58; 0.804249
287188994746   278.74 MHz
No significant differences in utilization coefficients.