Hachage avec java

Fermé
ayaf Messages postés 3 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 2 novembre 2005 - 2 nov. 2005 à 14:42
 Werpro - 26 mars 2011 à 15:18
Bonjour a tout le monde,
Je tiens tout d'abord a remercier Misdrhaal et Hack Track qui m'ont aide la derniere fois a resoudre mon probleme d'algorithme(temps d'execution et autre...) surtout toi Hack Track,merci.Je viens malheureusement aujourd'hui avec un autre probleme.Etant donne que je n'ai pas etudie java(j'ai juste quelques connaissances) et que nous utilisons java pour la programmation,il m'est assez difficile de resoudre certains problemes comme celui d'eliminer une collision dans un hachage.Je comprends l'algorithme mais ne sais pas par ou commencer pour ecrire le programme,alors j'ai besoin d'aide.En outre j'aimerais bien savoir comment se fait une recherche lineaire et un double hachage.Qu'apelle t-on adressage ouvert? J'espere ne pas avoir exagere dans les questions et attends impatiemment vos reponses.Merci d'avance
Florence
A voir également:

2 réponses

Utilisateur anonyme
3 nov. 2005 à 10:11
Salut!

Les recherches linéaire ou par double hachage vont utiliser des fonctions secondaires.

Soit la fonction de hachage :
h(c)
répartissant des éléments dans une table de taille m.

Celleci peut générer des collisions.
Pour résoudre celles-ci, il exsite plusieurs méthodes, regroupées par type.
Un de ceux-ci est la résolution des collisions par utilisations de fonctions secondaires.

Les fonctions secondaires sont définies telles que:
hi(c) =(h(c)+f(i))
avec h(c) la fonction primaire de hachage, f(i) une fonction secondaire et f(0)=0.

Dans le cas de la recherche linéaire f(i) = i.
Ce qui donne alors,
hi(c) = (h(c) + i ) mod m
avec, pour rappel, m=taille de la table de hachage.

En clair, si il y a collision, on regarde si la case suivante de la table est libre. si oui, on y place l'élément, sinon, on regarde dans la place suivante, etc.

Pour la recherche d'un élément dans la table, on calcule la clé avec la fonction de hachage primaire, on extrait l'élément se trouvant à cette place dans la table. Si cet élémént correspond à l'élément recherché, on l'a trouvé, sinon, on prend l'élément suivant dans la table et on l'extrait pour le comparer avec l'élément recherché, etc... jusqu'à ce que l'on trouve l'élement recherché.
Inconvénient: beaucoup d'éléments ayant occasionné une collision se retrouve groupé aux alentours de l'élément placé en premier (sans collision).

Dans le cas d'une recherche par hachage double, les fonctions secondaires seront des autres fonctions de hachage de la forme:
hi(c) = (h(c) + ih'(c) mod m.

Le principe d'utilisation est le même que pour la méthode précédente. Si il y acollision, on applique la première fonction de hachage secondaire, si il y a encore collision, on applique la deuxième fonction de hachage secondaire,...
La recherche par hachage double suit le même principe de fonctionnement: on calcule la clé de hachage pour un élément. La clé est trouvée => l'élément existe dans la table.
Si cet élémént ne correspond pas à celui recherché=> collision.
On applique alors la première fonction de hachage secondaire,...
A noter: avec cette méthode de hachage double, une clé différente est générée par chaque fonction de hachage pour un même élémént.

Je prends un café et je réponds ensuite à ta première question

;-)
HackTrack
4
Salut tu peut me trouver le mod de passe de ça : 23ea1d922145f8a437a1daea2f5d3674bfbdd578

je t'en supplie aide moi
0
Utilisateur anonyme
3 nov. 2005 à 12:46
Voici une démo de hachage linéaire.

Je te laisse le soin d'implémenter le double hachage ;-)

Les méthodes sont déjà prêtes mais vide.

Pour tester le double hachage une fois que tu l'auras implémenté, enlèves les commentaires devant

//HackTrackHashDemo ht = new HackTrackHashDemo(HackTrackHashDemo.COLLISION_HANDLER_DOUBLE_HASH);

ajoute-s-en devant
HackTrackHashDemo(HackTrackHashDemo.COLLISION_HANDLER_LINEAR);


et teste....
import java.util.ArrayList;
import java.util.List;

/**
 * Created on Nov 3, 2005
 * 
 * @author HackTrack
 *
 */
public class HackTrackHashDemo {
	public static final int COLLISION_HANDLER_LINEAR = 0;
	public static final int COLLISION_HANDLER_DOUBLE_HASH = 1;
	private int collisionHandling;
	private int size;
	private List valueList;

	/**
	 * Create a new HackTrackHashMap
	 * @param size Size of the map
	 * @param collisionHandling The type of collisionHandling to be used
	 */
	public HackTrackHashDemo(int collisionHandling, int size) {
		super();
		this.collisionHandling = collisionHandling;
		this.size = size;
		valueList = new ArrayList(this.size);
		for (int i = 0; i < this.size; i++) {
			valueList.add(i, null);
		}
	}

	/**
	 * Creates a new HackTrackHashMap with default size
	 * @param collisionHandling The type of collisionHandling to be used 
	 */
	public HackTrackHashDemo(int collisionHandling) {
		this(collisionHandling, 10);
	}

	/**
	 * Creates a new HackTrackHashMap with default size (10) and default collision handling method (double hash)
	 */
	public HackTrackHashDemo() {
		this(COLLISION_HANDLER_DOUBLE_HASH, 10);
	}

	/**
	 * Add a new entry into the table
	 * @param item The item to store into the table
	 * @return The object added to the table (null if object hasn't been added)
	 */
	public Object put(String item) {
		Object result = null;
		int hashKey = hash(item);
		if (valueList.get(hashKey) != null) {
			System.out.println("!!!!! COLLISION adding " + item);
			if (this.collisionHandling == COLLISION_HANDLER_DOUBLE_HASH) {
				hashKey = collisionDoubleHash(item);
			} else {
				hashKey = collisionLinearHash(hashKey);
			}
		}
		if (hashKey != -1) {
			result = item;
			add(hashKey, item);
			System.out.println(valueList);
		}
		return result;
	}

	/**
	 * Add an item into table
	 */
	private void add(int hashKey, Object value) {
		valueList.remove(hashKey);
		valueList.add(hashKey, value);
	}

	/**
	 * Handle a collision using linear method
	 * @param key The key to be used later to find back this item
	 * @param initialHash The initial hash code value
	 * @return The hash code for the object (-1 if no more available place in table)
	 */
	private int collisionLinearHash(int initialHash) {
		int h = -1;
		int index = initialHash;
		for (int i = 0; i < this.size; i++) {
			index++;
			if (index >= this.size)
				index = 0;
			if (valueList.get(index) == null) {
				h = index;
				System.out.println("New linear hash generated = " + h);
				break;
			}
		}
		System.out.println("New linear hash is " + h);
		return h;
	}

	/**
	 * Handle a collision using double hash method
	 * @param key The key to be used later to find back this item
	 * @return The hash code for the object (-1 if no more available place in table)
	 */
	private int collisionDoubleHash(String key) {
		int h = -1;
		// TO DO
		//Must return the new HashValue for 'key'.
		//h value must be greater or equal to 0 and lower than table size.
		return h;
	}

	/**
	 * Get an item with a specified key
	 * @param key The key to be used to find an item in the table
	 * @return The item ifound, else return null
	 */
	public Object get(String key) {
		Object result = null;
		int hashKey = hash(key);
		result = valueList.get(hashKey);
		if (result != null && !result.equals(key)) {
			if (this.collisionHandling == COLLISION_HANDLER_DOUBLE_HASH) {
				result = getDoubleHash(key);
			} else {
				result = getLinearHash(hashKey, key);
			}
		}
		return result;
	}

	/**
	 *  Find an object using linear hash
	 * @param key Item to find
	 */
	private Object getLinearHash(int initialHash, String key) {
		Object result = null;
		int index = initialHash;
		for (int i = 0; i <= this.size; i++) {
			index++;
			if (index >= this.size)
				index = 0;
			if (valueList.get(index) != null && valueList.get(index).equals(key)) {
				result = valueList.get(index);
				break;
			}
		}
		return result;
	}

	/**
	 *  Find an object using double hash
	 * @param key Item to find
	 */
	private Object getDoubleHash(String key) {
		Object result = null;
		//TO DO
		//Must return the Object for 'key' using double hash
		//Null if not found
		return result;
	}

	/**
	 * Get hash code for a specified String
	 * @param str
	 * @return
	 */
	private int hash(String str) {
		int h = 0;
		for (int i = 0; i < str.length(); i++) {
			h = 31 * h + str.charAt(i);
		}
		h = Math.abs(h % this.size);
		return h;
	}

	public static void main(String[] args) {
		String[] keys =
			{
				"hello",
				"goodbye",
				"damn",
				"go on!",
				"hacktrack",
				"java",
				"hashcode",
				"yessss",
				"development",
				"doubleHash" };
		//HackTrackHashDemo ht = new HackTrackHashDemo(HackTrackHashDemo.COLLISION_HANDLER_DOUBLE_HASH);
		HackTrackHashDemo ht = new HackTrackHashDemo(HackTrackHashDemo.COLLISION_HANDLER_LINEAR);
		
		//Adding items to table
		for (int i = 0; i < keys.length; i++) {
			ht.put(keys[i]);
		}

		//Searching items into table
		for (int i = 0; i < keys.length; i++) {
			System.out.println("Get (" + keys[i] + ") = " + ht.get(keys[i]));
		}

	}
}



;-)
HackTrack
1