Foros del Web » Programación para mayores de 30 ;) » Programación General »

funciones HASH

Estas en el tema de funciones HASH en el foro de Programación General en Foros del Web. Hola de nuevo, alguno sabe programar una funcion hash que devuelva valores comprendidos dentro de un rango? por ejemplo, que devuelva valores entre 0 y ...
  #1 (permalink)  
Antiguo 22/03/2005, 11:08
 
Fecha de Ingreso: diciembre-2003
Mensajes: 190
Antigüedad: 20 años, 11 meses
Puntos: 0
funciones HASH

Hola de nuevo, alguno sabe programar una funcion hash que devuelva valores comprendidos dentro de un rango? por ejemplo, que devuelva valores entre 0 y 100.

Yo uso esta pero hay veces en que da error fatall


/* Funcion hash que calcula la posicion del identificador (ELF Hash Function )*/
int f_hash (char *cadena) {


int len;
unsigned int hash = 0;
unsigned int x = 0;
unsigned int i = 0;

len = MAX;

for(i = 0; i < len; cadena++, i++)
{
hash = ((hash << 4) + (*cadena));
if((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
}

return (hash & 0x7FFFFFFF) ;


}
  #2 (permalink)  
Antiguo 22/03/2005, 11:29
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
¿No sería mejor cambiar len = MAX; por len = strlen(cadena);?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 22/03/2005, 12:41
 
Fecha de Ingreso: diciembre-2003
Mensajes: 190
Antigüedad: 20 años, 11 meses
Puntos: 0
He puesto lo que me has dicho, pero aun asi me sigue dando valores hash fuera del rango. He encontrado un par de funciones en internet pero en ninguna de ellas he visto que se pueda limitar el resultado mediante un parametro pasado a la funcion.

Cita:
Iniciado por Eternal Idol
¿No sería mejor cambiar len = MAX; por len = strlen(cadena);?
  #4 (permalink)  
Antiguo 22/03/2005, 13:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Ese codigo era para que no se produjeran mas errores fatales; ¿Que es lo que estas tratando de hacer exactamente?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 22/03/2005, 15:31
 
Fecha de Ingreso: diciembre-2003
Mensajes: 190
Antigüedad: 20 años, 11 meses
Puntos: 0
Estoy trabajando con el FLEX que es una analizador morfologico. Y cada identificador que encuentra lo meto en una tabla hash que tiene el siguiente aspecto

struct n { /*declara una estructura con la etiqueta nodo*/
char nombre[10];
int tipo;
int linea;
} nodo [MAX];

MAX es el tamaño. Cada vez que encuentro un identificador lo añado a la tabla hash mediante una funcion que hace lo siguiente

calcula el valor hash
-se ha a esa posicion
-si en esa posicion hay algo es que el identificador esta declarado dos veces
-si esta vacia entonces lo guarda

Voy a seguir probando con otros algoritmos hash a ver que encuentro.
Muchas gracias por tu dedicacion y esfuerzo



Cita:
Iniciado por Eternal Idol
Ese codigo era para que no se produjeran mas errores fatales; ¿Que es lo que estas tratando de hacer exactamente?
  #6 (permalink)  
Antiguo 28/09/2005, 16:30
 
Fecha de Ingreso: agosto-2003
Mensajes: 272
Antigüedad: 21 años, 2 meses
Puntos: 0
si, muy simple usa % 100 para hacer la dispercion y da valores entre 0 y 99 osea dentro de 0 y 100
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:37.