SQLite est un petit SGBD. Il est largement utilisé pour ses performances pour les petites bases des données (sur Smartphone, navigateurs web, applications de gestion de petite taille, etc.). SQLite est Open Source et il est écrit en C, c'est pourquoi il représente un excellent choix pour analyser le code d'un SGBD et voir du plus près les algorithmes et les techniques utilisés en bas niveau d'un SGBD (les module les plus proches du fichier physique - voir schéma).
Dans cet article, nous allons voir une fonction très intéressante de SQLite : c'est la fonction de hachage.
Le hachage est une structure très efficace pour les fichiers. Elle permet de réduire considérablement le nombre d'accès disque lors d'une recherche d'un enregistrement et sans utiliser des structures secondaires (index, arbre-B+, etc.).
L'idée est de choisir la position d'insertion des nouveaux éléments en appliquant une fonction, dite fonction du hachage, sur un champ (clé du hachage) de l'enregistrement à insérer.
Cette approche est largement décrite par différents auteurs. Pour plus de détails, je vous recommande le cours de Pr. D.E. Zegour :
Structures des données avancées
Restons sur notre SGBD d'aujourd'hui : SQLite. Comme nous avons mentionné, le code source de SQLite est disponible.L' analyse de ce code en cherchant les fonctions liées au hachage ne peut être plus simple puisque le code est bien organisé; nous pouvons constater directement les deux fichiers :
La fonction qui nous interesse c'est la fonction strHash suivante :
Cette fonction prend comme paramètre une chaine de caractère et nous retourne un entier (non signé) qui représente le numéro de bloc où indérer l'enregistrement.
Les trois opérateurs principaux sont :
Notons que nous aurons besoin des codes binaires des caractères suivants :
h : 0000000000000000000000000000 ^
a : 0000000000000000000001100001
= : 0000000000000000000001100001
h : 0000000000000000000001100001 ^
b : 0000000000000000000001100010
= : 0000000000000000001100001011
h : 0000000000000000001100001011 ^
c : 0000000000000000000001100011
= : 0000000000000001101100100000
Ainsi, la valeur de hachage pour la chaîne de caractères "Abc" est :6944 .
Dans cet article, nous allons voir une fonction très intéressante de SQLite : c'est la fonction de hachage.
Le hachage est une structure très efficace pour les fichiers. Elle permet de réduire considérablement le nombre d'accès disque lors d'une recherche d'un enregistrement et sans utiliser des structures secondaires (index, arbre-B+, etc.).
L'idée est de choisir la position d'insertion des nouveaux éléments en appliquant une fonction, dite fonction du hachage, sur un champ (clé du hachage) de l'enregistrement à insérer.
Cette approche est largement décrite par différents auteurs. Pour plus de détails, je vous recommande le cours de Pr. D.E. Zegour :
Structures des données avancées
Restons sur notre SGBD d'aujourd'hui : SQLite. Comme nous avons mentionné, le code source de SQLite est disponible.L' analyse de ce code en cherchant les fonctions liées au hachage ne peut être plus simple puisque le code est bien organisé; nous pouvons constater directement les deux fichiers :
- hash.h
- hash.c
La fonction qui nous interesse c'est la fonction strHash suivante :
/* ** The hashing function. */ static unsigned int strHash(const char *z){ unsigned int h = 0; unsigned char c; while( (c = (unsigned char)*z++)!=0 ){ h = (h<<3) ^ h ^ sqlite3UpperToLower[c]; } return h; }
Cette fonction prend comme paramètre une chaine de caractère et nous retourne un entier (non signé) qui représente le numéro de bloc où indérer l'enregistrement.
Les trois opérateurs principaux sont :
- << : décalage à gauche par un certain nombre de bits,
- ^ : le OU bit-à-bit exclusif,
- sqlite3UpperToLower : convertir les majuscule en miniscule.
Notons que nous aurons besoin des codes binaires des caractères suivants :
- a (en miniscule) : 01100001
- b : 01100010
- c : 01100011
while( (c = (unsigned char)*z++)!=0 ){ ... }
- Pour le A :
h : 0000000000000000000000000000 ^
a : 0000000000000000000001100001
= : 0000000000000000000001100001
- Pour le b :
h : 0000000000000000000001100001 ^
b : 0000000000000000000001100010
= : 0000000000000000001100001011
- Pour le c :
h : 0000000000000000001100001011 ^
c : 0000000000000000000001100011
= : 0000000000000001101100100000
Ainsi, la valeur de hachage pour la chaîne de caractères "Abc" est :6944 .