Un rapide de chaîne de somme de contrôle de la fonction en Perl générer des valeurs dans l'0..2^32-1 gamme

Je suis à la recherche d'un Perl chaîne de somme de contrôle de la fonction avec les propriétés suivantes:

  • D'entrée: chaîne Unicode de longueur indéfinie ($string)
  • De sortie: entier non signé ($hash), pour qui 0 <= $hash <= 2^32-1 détient (0 à 4294967295, correspondant à la taille de 4 octets MySQL unsigned int)

Pseudo-code:

sub checksum {
    my $string = shift;
    my $hash;
    ... checksum logic goes here ...
    die unless ($hash >= 0);
    die unless ($hash <= 4_294_967_295);
    return $hash;
}

Idéalement, la fonction de la somme de contrôle devrait être rapide à exécuter et devrait générer des valeurs un peu de manière uniforme dans l'espace cible (0 .. 2^32-1) pour éviter les collisions. Dans cette application aléatoire des collisions sont totalement non-mortels, mais, évidemment, je veux éviter, dans la mesure où c'est possible.

compte tenu de ces exigences, quelle est la meilleure façon de résoudre ce problème?

Vous voulez éviter les collisions de toutes les chaînes, mais seulement de 4 milliards d'possible digère? Pourquoi utiliser un entier important? Que diriez-vous simplement en utilisant quelque chose comme MD5, même si vous devez stocker le recueil comme une chaîne de caractères?
"Vous voulez éviter les collisions avec tous les possible des chaînes" - Non, comme indiqué dans la question, j'ai simplement "vous voulez les éviter dans la mesure où c'est possible".
"Pourquoi est-utilisation d'un nombre entier d'important?" - Comme indiqué dans la question de la somme de contrôle seront stockées dans un "4 octets MySQL unsigned int".

OriginalL'auteur knorv | 2009-12-22