Gast
2011-08-19, 18:39:40
Hi Leute,
ich bin einen C-Quellcode am überarbeiten, in dem folgende Hash-Funktion für Strings vorkommt:
static int hash ( const char *szName, int maxsize, int length )
{
static int mmult[] = {
262139, 259459, 256889, 254291, 251701, 249133, 246709, 244247,
241667, 239179, 236609, 233983, 231289, 228859, 226357, 223829,
221281, 218849, 216319, 213721, 211093, 208673, 206263, 203773,
201233, 198637, 196159, 193603, 191161, 188701, 186149, 183761,
181303, 178873, 176389, 173897, 171469, 169049, 166471, 163871,
161387, 158941, 156437, 153949, 151531, 149159, 146749, 144299,
141709, 139369, 136889, 134591, 132169, 129641, 127343, 124853,
122477, 120163, 117757, 115361, 112979, 110567, 108179, 105727,
103387, 101021, 98639, 96179, 93911, 91583, 89317, 86939, 84521,
82183, 79939, 77587, 75307, 72959, 70793, 68447, 66103
};
int n = 0;
for (int j = 0; j < length; ++j )
{
int iName = szName[j];
n += mmult[j] * iName;
}
return ( abs ( n ) % maxsize ); /* integer abs */
}
Das Problem ist, dass die zu hashenden Strings auf eine Länge von 80 Chars beschränkt sind, da das Array mmult[] nur 80 Elemente hat. Es ist aber notwendig, dass ich auch längere Strings hashen kann. Dazu müsste ich die Funktion so abändern, dass mmult[] mehr Elemente enthält (z.B. 100), leider habe ich keine so rechte Idee, was für Werte ich da eintragen müsste. Welches System hinter den 80 bereits vorhanden Einträgen steckt, verstehe ich nämlich auch nicht. Kann mir da jemand weiterhelfen? Sind das vielleicht aufeinanderfolgende Primzahlen?
ich bin einen C-Quellcode am überarbeiten, in dem folgende Hash-Funktion für Strings vorkommt:
static int hash ( const char *szName, int maxsize, int length )
{
static int mmult[] = {
262139, 259459, 256889, 254291, 251701, 249133, 246709, 244247,
241667, 239179, 236609, 233983, 231289, 228859, 226357, 223829,
221281, 218849, 216319, 213721, 211093, 208673, 206263, 203773,
201233, 198637, 196159, 193603, 191161, 188701, 186149, 183761,
181303, 178873, 176389, 173897, 171469, 169049, 166471, 163871,
161387, 158941, 156437, 153949, 151531, 149159, 146749, 144299,
141709, 139369, 136889, 134591, 132169, 129641, 127343, 124853,
122477, 120163, 117757, 115361, 112979, 110567, 108179, 105727,
103387, 101021, 98639, 96179, 93911, 91583, 89317, 86939, 84521,
82183, 79939, 77587, 75307, 72959, 70793, 68447, 66103
};
int n = 0;
for (int j = 0; j < length; ++j )
{
int iName = szName[j];
n += mmult[j] * iName;
}
return ( abs ( n ) % maxsize ); /* integer abs */
}
Das Problem ist, dass die zu hashenden Strings auf eine Länge von 80 Chars beschränkt sind, da das Array mmult[] nur 80 Elemente hat. Es ist aber notwendig, dass ich auch längere Strings hashen kann. Dazu müsste ich die Funktion so abändern, dass mmult[] mehr Elemente enthält (z.B. 100), leider habe ich keine so rechte Idee, was für Werte ich da eintragen müsste. Welches System hinter den 80 bereits vorhanden Einträgen steckt, verstehe ich nämlich auch nicht. Kann mir da jemand weiterhelfen? Sind das vielleicht aufeinanderfolgende Primzahlen?