32-bit hash is way too small when collisions are deadly
Not sure if I have ever received this error in my life. But maybe I did without realizing it. I stopped using generics long ago because of **STRANGE** errors that can be related to this, giving they always use CRC. Several parts of the compiler use CRC-32 to shorten names. Sadly, due to the birthday paradox this results in a non-trivial probability of collisions that give cryptic error messages. Can they be replaced with something longer, at least CRC-64 (or WyHash64 :D), or maybe even somehow do it without hashing at all, e.g. have all units store long string tables and reference their elements by number? Compiling this on x86-** yields `Error: Asm: Duplicate label P$PROGRAM$_$SOMETYPE_$_SOMENESTEDTYPE_$_YETANOTHERNESTEDTYPE_$__$$_HELLO$crc4ED50114`. May depend on the compiler and platform though. Can probably get something even worse (`Error while linking`, I think?) if you are even more unlucky. ```pascal {$mode objfpc} type Collide29685295 = type uint32; Collide32060020 = type uint32; SomeType = class type SomeNestedType = class type YetAnotherNestedType = class class procedure Hello(arg: YetAnotherNestedType; arg2: Collide29685295); static; class procedure Hello(arg: YetAnotherNestedType; arg2: Collide32060020); static; end; end; end; class procedure SomeType.SomeNestedType.YetAnotherNestedType.Hello(arg: YetAnotherNestedType; arg2: Collide29685295); begin end; class procedure SomeType.SomeNestedType.YetAnotherNestedType.Hello(arg: YetAnotherNestedType; arg2: Collide32060020); begin end; begin end. ```
issue