GOOGLE ADS

dimanche 17 avril 2022

Confus à propos d'une fonction de hachage de chaîne

Alors que je parcourais certaines fonctions de hachage de chaîne, je suis tombé sur celui-ci (code ci-dessous). La fonction traite la chaîne quatre octets à la fois et interprète chacun des blocs de quatre octets comme une seule valeur entière longue. Les valeurs entières des blocs de quatre octets sont additionnées. Au final, la somme résultante est convertie dans la plage de 0 à M-1 à l'aide de l'opérateur de module. Voici le code de la fonction:

// Use folding on a string, summed 4 bytes at a time
long sfold(String s, int M) {
int intLength = s.length() / 4;
long sum = 0;
for (int j = 0; j < intLength; j++) {
char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
long mult = 1;
for (int k = 0; k < c.length; k++) {
sum += c[k] * mult;
mult *= 256;
}
}
char c[] = s.substring(intLength * 4).toCharArray();
long mult = 1;
for (int k = 0; k < c.length; k++) {
sum += c[k] * mult;
mult *= 256;
}
return(Math.abs(sum) % M);
}

The confusion for me is this chunk of code, especially the first line.

 char c[] = s.substring(intLength * 4).toCharArray();
long mult = 1;
for (int k = 0; k < c.length; k++) {
sum += c[k] * mult;
mult *= 256;

A ma connaissance, la fonction de sous-chaîne utilisée dans cette ligne prend comme argument: begin index inclusivement, La sous-chaîne commencera à partir du beginIndex spécifié et s'étendra jusqu'à la fin de la chaîne. A titre d'exemple, supposons que nous voulions hacher la chaîne suivante: aaaabbbb. Dans ce cas, intLength vaudra 2 ( deuxième ligne de code de fonction). Remplacer la valeur de intlength dans s.substring(intLength * 4).toCharArray()nous donnera ce s.substring(8).toCharArray()qui signifie que l'index de chaîne est hors limites étant donné que la chaîne à hacher a 8 caractères. Je ne comprends pas trop ce qui se passe!


Solution du problème

Cette fonction de hachage est horrible, mais pour répondre à votre question :

Il n'y a pas IndexOutOfBoundsException, parce que "aaaabbbb".substring(8)c'est""

Le but de cette dernière boucle est de traiter les restes lorsque la longueur de la chaîne n'est pas un multiple de 4. Quand sest "aaaabbbbcc", par exemple, puis intLength == 2, et s.substring(8)est "cc".

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...