Ответ
Хеш-сумма (хеш) — это результат работы криптографической хеш-функции, преобразующей произвольный массив данных (строку, файл) в строку фиксированной длины (последовательность символов).
Основные свойства:
- Детерминированность: Одинаковые входные данные всегда дают одинаковую хеш-сумму.
- Фиксированный размер: Выходная строма имеет постоянную длину (например, MD5 — 32 hex-символа, SHA-256 — 64).
- Быстрота вычисления.
- Эффект лавины: Малейшее изменение входных данных (1 бит) полностью меняет хеш.
- Необратимость (стойкость к восстановлению): По хешу практически невозможно восстановить исходные данные.
- Устойчивость к коллизиям: Крайне мала вероятность, что разным данным соответствует одинаковый хеш.
Применение:
- Проверка целостности данных (скачанных файлов).
- Хеширование паролей в базах данных.
- Построение хеш-таблиц.
- Цифровые подписи.
Пример вычисления SHA-256 в Java:
import java.security.MessageDigest;
import java.math.BigInteger;
public class HashExample {
public static String calculateSHA256(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = md.digest(input.getBytes("UTF-8"));
// Конвертируем байты в hex-строку
BigInteger number = new BigInteger(1, hashBytes);
StringBuilder hexString = new StringBuilder(number.toString(16));
// Дополняем нулями слева
while (hexString.length() < 64) {
hexString.insert(0, '0');
}
return hexString.toString();
}
public static void main(String[] args) throws Exception {
String data = "Hello, World!";
String hash = calculateSHA256(data);
System.out.println(hash);
// dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
}
} Ответ 18+ 🔞
Давай разберем эту всю хеш-суммовую магию, чтобы не сидел как Герасим, блядь, и не говорил «Му-му», когда тебя спросят, что это за хуйня.
Представь, у тебя есть любой кусок данных — хоть «Война и мир», хоть фотка твоей собаки, хоть просто слово «хуй». Хеш-сумма — это как будто ты пропускаешь этот массив через мясорубку, а на выходе получаешь всегда одну и ту же по длине сосиску из цифр и букв. Эта сосиска и есть хеш.
Какие у этой сосиски, прости господи, свойства, блядь:
- Детерминированность. Это не я, это термин. Означает, что один и тот же кусок мяса (данных) ты сколько ни крути — сосиска будет одинаковая. Засунул «привет» — получил одну сосиску. Ещё раз засунул «привет» — получил ту же самую, блядь, сосиску. Не подсовывай мне тут колбасу другого сорта.
- Фиксированный размер. Неважно, что ты засовываешь: мысль о смысле жизни или инструкцию к микроволновке — сосиска будет стандартной длины. MD5 — 32 знака, SHA-256 — 64 знака. Как пачка сигарет, только из символов.
- Быстрота. Современный процессор щёлкает эти хеши как семечки. Не то что в мои молодые годы, блядь...
- Эффект лавины. Вот это, сука, самое офигенное. Изменил в исходнике одну буковку, один бит, один пиксель — и вся сосиска на выходе абсолютно другая, до неузнаваемости. Не «немного другая», а пиздец как другая. Как будто вместо котлеты в мясорубку сунул динамит.
- Необратимость. Вот эту самую сосиску невозможно обратно превратить в «Войну и мир». Вообще. Можно пытаться, но это как из котлеты по-киевски восстановить курицу, которая её снесла. Удачи, епта.
- Устойчивость к коллизиям. Вероятность, что для двух РАЗНЫХ данных выпадет ОДИНАКОВАЯ сосиска (хеш), — овердохуище мала. Практически ноль. Это как найти двух людей с одинаковыми отпечатками пальцев. Теоретически можно, но на практике — хуй там.
А где эту хуйню применяют?
- Проверка целостности. Скачал ты порно-архив с торрентов. Рядом лежит файлик
porno_archive.iso.sha256. Посчитал хеш своего скачанного файла — сравнил с тем, что в файлике. Совпало? Значит, тебе не подсунули вместо фильма запись «Пусть говорят». Не совпало? Качай заново, тебя наебали. - Пароли. Умные дядьки в базах данных хранят не сам твой пароль «12345», а его хеш. Когда ты входишь, система хеширует введённую «12345» и сравнивает с тем, что лежит в базе. Совпало — welcome. Даже если базу утянут, хакеры увидят только эти самые сосиски, а не пароли. Красиво, блядь.
- Хеш-таблицы. Быстрый поиск данных, но это уже другая история, в рот меня чих-пых.
- Цифровые подписи. Тоже всё на этом держится, но если начну объяснять, у меня терпения ноль ебать.
Ну и примерчик на Java, чтобы не быть просто болтуном:
import java.security.MessageDigest;
import java.math.BigInteger;
public class HashExample {
public static String calculateSHA256(String input) throws Exception {
// Берём мясорубку с надписью "SHA-256"
MessageDigest md = MessageDigest.getInstance("SHA-256");
// Пихаем в неё наши данные
byte[] hashBytes = md.digest(input.getBytes("UTF-8"));
// Полученную мясную массу (байты) переводим в красивую hex-сосиску
BigInteger number = new BigInteger(1, hashBytes);
StringBuilder hexString = new StringBuilder(number.toString(16));
// Если сосиска коротковата, набиваем её нулями слева, как полагается
while (hexString.length() < 64) {
hexString.insert(0, '0');
}
return hexString.toString(); // Ваша сосиска готова к подаче
}
public static void main(String[] args) throws Exception {
String data = "Hello, World!";
String hash = calculateSHA256(data);
System.out.println(hash);
// Выведет: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
// Попробуй изменить строку data хоть на йоту — и весь этот красивый набор символов пойдёт пиздой.
}
}
Вот и вся магия, ёпта. Не благодари.