Skeletron nino
utiliza tu unsigned int si tanto te preocupa, no me hagas mucho caso cuando me haces preguntas sobre numeros y el motivo del porque
Solo, queria buscarte una salida eficiente a la duda que previamente tenias, lamentablemente no puedo abundarte en relacion a los numeros y los calculos, pero creo que pude responder tu problema inicial
Como sea, hice una prueba con CRC32 en mi MySQL para ver cuando comenzaba a colisionar (No me aguante la duda
) hice un bucle con 1 millon de registros dinamicos
y bueno, verifique luego el asuntito de colisiones con CRC32 como indices y que vi... pues el average de colision fue 1% por cada 98,000 registros
lo cual puede ser preocupante si vas a insertar muchas entradas diarias, pero si nisiquiera vas a hacercarte a los 70,000 registros anual obvia todo esto que te digo de las colisiones. Ahora, si quieres evitarte obtener registros duplicados porque colisionen, podrias en tu consulta SQL hacer algo tipo:
SELECT campo, campo, campo WHERE id = crc32('dato') AND link = 'dato'
Asi aunque existieran colisiones, el registro retornado sera unico siempre
Al menos claro esta que consideres implementar tu propia hash de 64bits, pero para esto tendrias que rebuscar mucho y truncar el resultado devuelto por MD5() por ejemplo para que no sea tannnn largo el indice. Pero creo, que en tu caso no habra problemas con el uso de CRC32() si todo es como me lo planteaste en cuanto a la actividad diaria, no tendra motivos algunos para colisionar.
Espero, que puedas encontrar tu respuesta que solicitas ahora... como te dije, no me hagas caso cuando te respondo sobre algo relacionado a numeros, utiliza tu UNSIGNED INT si consideras el valor retornado por CRC32() cabe ahi, la prueba siempre podras hacerla antes de definitivamente lanzarte. Que yo utilize DECIMAL no implica que tu tambien lo hagas, entiendo las capacidades que posee tu servidor, en comparacion a las capacidades que poseen el servidor donde he implementado decimal con crc32.
Saludos.