Ось пояснення в умовах мирян.
Припустимо, ви хочете поповнити бібліотеку книгами, а не просто заповнити їх там, але ви хочете мати можливість їх легко знову знайти, коли вам знадобляться.
Отже, ви вирішили, що якщо людина, яка хоче прочитати книгу, знає назву книги та точну назву для завантаження, то це все, що потрібно. Маючи заголовок, людина, за допомогою бібліотекаря, повинна мати можливість легко і швидко знайти книгу.
Отже, як ви можете це зробити? Ну, очевидно, ви можете зберегти якийсь перелік того, куди ви кладете кожну книгу, але тоді у вас є та сама проблема, що і з пошуком бібліотеки, вам потрібно пошукати цей список. Звичайно, список буде меншим і простішим у пошуку, але все ж ви не хочете послідовно здійснювати пошук з одного кінця бібліотеки (або списку) в інший.
Ви хочете чогось, що з назвою книги може одразу дати вам потрібне місце, тому все, що вам потрібно зробити, - це просто пройти до правої полиці та забрати книгу.
Але як це можна зробити? Що ж, з трохи роздумів, коли ви заповнюєте бібліотеку, і багато роботи, коли ви заповнюєте бібліотеку.
Замість того, щоб просто починати поповнювати бібліотеку з одного кінця в інший, ви придумали маленький розумний метод. Ви берете заголовок книги, запускаєте її через невелику комп'ютерну програму, яка виписує номер полиці та номер слота на цій полиці. Тут ви розміщуєте книгу.
Краса цієї програми полягає в тому, що згодом, коли людина повертається, щоб прочитати книгу, ви ще раз подаєте заголовок через програму, і отримуєте назад той самий номер полиці та номер слота, який вам спочатку дали, і це де знаходиться книга.
Програма, як уже згадували інші, називається алгоритмом хешу або хеш-обчисленням і, як правило, працює, беручи в нього дані, що подаються (назва книги в цьому випадку) і обчислює з неї число.
Для простоти скажімо, що він просто перетворює кожну букву та символ у число та підсумовує їх. Насправді це набагато складніше, ніж це, але давайте залишимо це на цьому зараз.
Краса такого алгоритму полягає в тому, що якщо ви будете подавати один і той же вхід знову і знову, він буде постійно виплювати одне і те ж число кожного разу.
Ок, так це в основному, як працює хеш-таблиця.
Далі йде технічний матеріал.
По-перше, є розмір номера. Зазвичай вихід такого алгоритму хешу знаходиться в діапазоні деякої великої кількості, як правило, набагато більше, ніж простір у вашій таблиці. Наприклад, скажімо, що у нас є місце для рівно одного мільйона книг у бібліотеці. Вихід хеш-розрахунку може бути в межах від 0 до одного мільярда, що набагато вище.
Отже, що ми робимо? Ми використовуємо щось, що називається модулем обчислення, яке в основному говорить про те, що якщо ви порахували потрібне число (тобто мільярдне число), але хочете залишитися в набагато меншому діапазоні, кожен раз, коли ви досягаєте межі цього меншого діапазону, на якому ви починали назад 0, але ви повинні слідкувати за тим, наскільки далеко у великій послідовності ви прийшли.
Скажіть, що вихід алгоритму хешу знаходиться в діапазоні від 0 до 20, і ви отримуєте значення 17 з певного заголовка. Якщо розмір бібліотеки становить лише 7 книг, ви рахуєте 1, 2, 3, 4, 5, 6, а коли добираєтесь до 7, ви починаєте з 0. Оскільки нам потрібно порахувати 17 разів, у нас є 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, а кінцеве число - 3.
Звичайно, обчислення модуля не робиться так, це робиться з поділом і залишком. Залишок ділення 17 на 7 - 3 (7 переходить в 2 рази на 17 в 14, а різниця між 17 і 14 - 3).
Таким чином, ви помістите книгу в слот №3.
Це призводить до наступної проблеми. Зіткнення. Оскільки алгоритм не має можливості виділити книги таким чином, щоб вони точно заповнили бібліотеку (або хеш-таблицю, якщо ви хочете), він незмінно закінчить обчислення числа, яке було використано раніше. У сенсі бібліотеки, коли ви потрапляєте на полицю та номер слота, в який хочете помістити книгу, там вже є книга.
Існують різні методи обробки зіткнень, включаючи запуск даних у ще один розрахунок, щоб отримати ще одне місце в таблиці ( подвійне хешування ) або просто знайти простір, близький до того, який вам було надано (тобто прямо поруч із попередньою книгою, що передбачає слот був доступний також відомий як лінійне зондування ). Це означатиме, що вам потрібно щось викопати, коли ви намагаєтесь знайти книгу пізніше, але все ж краще, ніж просто починати в одному кінці бібліотеки.
Нарешті, в якийсь момент, можливо, ви захочете помістити в бібліотеку більше книг, ніж дозволяє бібліотека. Іншими словами, вам потрібно побудувати більшу бібліотеку. Оскільки точне місце в бібліотеці було розраховано, використовуючи точний та поточний розмір бібліотеки, випливає, що якщо змінити розмір бібліотеки, вам, можливо, доведеться знайти нові плями для всіх книг, оскільки розрахунок зроблений для пошуку їх плям змінилося.
Я сподіваюся, що це пояснення було трохи більше на землю, ніж відра та функції :)