Busco una función Perl cadena de suma de comprobación con las siguientes propiedades:Una función de cadena suma de comprobación rápida de los valores de generación de Perl en el rango 0..2^32-1
- de entrada: cadena Unicode de indefinido longitud (
$string
) - de salida: número entero sin signo (
$hash
), para lo cual0 <= $hash <= 2^32-1
bodegas (0 a 4,294,967,295, que corresponde al tamaño de un 4-byte MySQL unsigned int)
Pseudo-código:
sub checksum {
my $string = shift;
my $hash;
... checksum logic goes here ...
die unless ($hash >= 0);
die unless ($hash <= 4_294_967_295);
return $hash;
}
Idealmente la función de suma de control debe ser rápido para funcionar y debe generar valores algo de manera uniforme en el espacio objetivo (0
.. 2^32-1
) para evitar colisiones. En esta aplicación, las colisiones aleatorias son totalmente no fatales, pero obviamente quiero evitarlas en la medida de lo posible.
Teniendo en cuenta estos requisitos, ¿cuál es la mejor manera de resolver esto?
¿Quieres evitar las colisiones con todas las secuencias posibles, pero sólo tienen un 4 mil millones posible digiere? ¿Por qué es importante usar un número entero? ¿Qué tal si usamos algo como MD5, incluso si tiene que almacenar el resumen como una cadena? –
"Desea evitar colisiones con todas las cadenas posibles" - No, como se indica en la pregunta, simplemente "quiero evitarlas en la medida de lo posible". – knorv
"¿Por qué es importante usar un número entero?" - Como se indica en la pregunta, la suma de comprobación se almacenará en "un MySQL de 4 bytes sin firmar int". – knorv