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
Werpro - 26 mars 2011 à 15:18
A voir également:
- Hachage avec java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Java décompiler - Télécharger - Langages
- Waptrick jeux pes 2016 java - Forum logiciel systeme
2 réponses
Utilisateur anonyme
3 nov. 2005 à 10:11
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
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
Utilisateur anonyme
3 nov. 2005 à 12:46
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
ajoute-s-en devant
et teste....
;-)
HackTrack
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
26 mars 2011 à 15:18
je t'en supplie aide moi