Je cherche à utiliser une fonction de hachage roulant afin que je puisse prendre des hachages de n-grammes d'une très grande chaîne.Y a-t-il des implémentations de travail de la fonction de hachage roulante utilisée dans l'algorithme de recherche de chaîne Rabin-Karp?
Par exemple:
"stackoverflow", divisé en 5 grammes serait:
"pile", "tacko", "ackov", "ckove", "kover", « overf », « verfl », « erflo », « rflow »
Ceci est idéal pour une fonction de hachage de roulement car après je calcule le premier hachage n-gramme, les suivantes sont relativement pas cher pour calculer parce que je il suffit de laisser tomber la première lettre du premier hachage et ajouter le nouvelle dernière lettre du deuxième hash.
je sais qu'en général cette fonction de hachage est généré en tant que:
H = c un k - 1 + c un k - 2 + c un k - 3 + ... + c k un où a est une constante et c1, ..., ck sont les caractères d'entrée.
Si vous suivez ce lien sur le Rabin-Karp string search algorithm, il indique que "a" est généralement un grand premier. Je veux que mes hachages soient stockés dans des entiers de 32 bits, donc quelle doit être la taille "a", de sorte que je ne déborde pas de mon entier?
Existe-t-il une implémentation existante de cette fonction de hachage quelque part que je pourrais déjà utiliser?
Voici une implémentation que j'ai créé:
public class hash2
{
public int prime = 101;
public int hash(String text)
{
int hash = 0;
for(int i = 0; i < text.length(); i++)
{
char c = text.charAt(i);
hash += c * (int) (Math.pow(prime, text.length() - 1 - i));
}
return hash;
}
public int rollHash(int previousHash, String previousText, String currentText)
{
char firstChar = previousText.charAt(0);
char lastChar = currentText.charAt(currentText.length() - 1);
int firstCharHash = firstChar * (int) (Math.pow(prime, previousText.length() - 1));
int hash = (previousHash - firstCharHash) * prime + lastChar;
return hash;
}
public static void main(String[] args)
{
hash2 hashify = new hash2();
int firstHash = hashify.hash("mydog");
System.out.println(firstHash);
System.out.println(hashify.hash("ydogr"));
System.out.println(hashify.rollHash(firstHash, "mydog", "ydogr"));
}
}
J'utilise 101 comme mon premier. Est-ce important si mes hachages vont déborder? Je pense que c'est souhaitable mais je ne suis pas sûr.
Est-ce que cela semble être la bonne façon de procéder?
Pourquoi le prime de cette application serait-il différent de la génération "hachée" de chaîne de caractères "normale"? – CPerkins
L'algorithme est assez simple qu'il est assez facile à implémenter à partir du pseudo-code. Avez-vous essayé de le coder vous-même? – MAK