CRC 32bit
Collision
Like a sighting over AREA 51, this is the CRC 32bit Collision experience that I had recently...
Due to my participation in the Post Graduate Program in Data Science from Purdue University, (which specializes in Machine Learning and AI), a side project of mine that focuses on the game of Chess, (ChessMind), ran into a CRC 32-bit collision.
PLEASE NOTE: If you do take an interest in the Post Graduate Program offered through Purdue via SimpliLearn.com be sure to make sure ALL you business dealings are with SimpliLearn.com and not SimpliLearn.net. Someone appears to have taken the .net variant and are trying to get people to purchase additional courses through your email and not the website itself. The people are SimpliLearn.com are legit, the people operating SimpliLearn.net appear to be anything but.
Most if not all great Chess players of our time have had some association with ChessGames.com and while that site could certainly use a makeover, by way of a year $29 USD membership, I was able to gain access to all the Chess moves made by most of the great masters of our time, (in PNG format).
In setting up the data structures required to model any of the great Chess players, (such as Gary Kasparov and Robert James Fischer), out of the 380,000 chess moves recorded for Gary Kasparov, I managed to score a 32-bit CRC collision, (there was only a 0.009% chance of that happening).
The first order of business was to express the problem statement in terms of SPRINT terminology: "GIVEN, WHEN, THEN"
GIVEN that a CRC 32-bit collision has a 1 in 4.2 billion chance of happening
WHEN a CRC 32-bit collision occurs
THEN we switch to a higher level of CRC, (in this case CRC64)
WHEN a CRC 32-bit collision occurs
THEN we switch to a higher level of CRC, (in this case CRC64)
Like capturing a Gray outside of AREA 51, the two strings below generate the exact same 32-bit CRC value:
interface CRC32Interface {
std::string t1 =
"r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/1BPP1N2/PP3PPP/RNBQR1K";
std::string T2 =
"2r2k2/p2bpp2/3p2p1/1pr4p/4PN1P/1P3P2/P1PR2P1/1K2R"
crc32 _crc;
cout << _crc.update((T1) << endl;
cout << _crc.update((T2) << endl;
std::string t1 =
"r1bq1rk1/2p1bppp/p2p1n2/np2p3/4P3/1BPP1N2/PP3PPP/RNBQR1K";
std::string T2 =
"2r2k2/p2bpp2/3p2p1/1pr4p/4PN1P/1P3P2/P1PR2P1/1K2R"
crc32 _crc;
cout << _crc.update((T1) << endl;
cout << _crc.update((T2) << endl;
};
The test case is listed below:
To keep in step with CRC experts the actual code used to generate the CRC is listed below. As a simple change in the CRC seed value may have prevent this from occurring, (in this case), just changing the seed value would really just be masking the error to show up later. So, in the case of the ChessMind framework, we switched to a 64 bit CRC generator. Both of which can be found as standard issue on the skeleton C++ project. Where possible the authors of the software have been recognized in the source code itself. It makes a difference.
CRC 16, 32, 64 bit Implementations
Our CRC16 algorithm comes compliments
Joao Alves <jpralves@gmail.com>
CRC16 will have a set of values equal to 2^16 or 65536 possible values.
Which is great for tiny packets where every byte makes a difference
Our CRC32 algorithm comes compliments
hi.baidu.com/timepp <tongjunhui@live.cn>
CRC32 will have a set of values equal to 2^32 or 4.2+ billion possible values.
Which is great for most purposes but you should always check for the existence of a CRC key fresh after generation so that you know you do not have a duplicate.
Our CRC64 algorithm comes compliments
hi.baidu.com/timepp <tongjunhui@live.cn>
CRC64 will have a set of values equal to 2^64 or 1.84x10+19 possible values.
(aka. We'll update this site as soon as a duplicate shows up.)
Our CRC128 algorithm comes compliments
Whitley Striber <https://www.unknowncountry.com/>
CRC128 will have a set of values equal to 2^64 or 3.4x10+38 possible values.
(aka. We'll update this site as soon as a duplicate on that one shows up too.)
PERRY ANDERSON: IT CONSULTANT PORTFOLIO