Добавлены новые статьи:
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
- Реализация Base64 на Java.md - Реализация SHA-256 на Java.md - Base64.md - Кодирование данных.md - Сжатие данных.md - Криптографическая хеш-функция.md - Кодирование данных.md и прочие
This commit is contained in:
parent
4ed89604e0
commit
4a1d913afa
39
dev/algorithm/GZIP.md
Normal file
39
dev/algorithm/GZIP.md
Normal file
@ -0,0 +1,39 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
|
||||
parents:
|
||||
- "[[../fundamental/Сжатие данных|Сжатие данных]]"
|
||||
linked:
|
||||
---
|
||||
GZIP (GNU ZIP) — это формат сжатия данных и программное обеспечение, разработанное для сжатия и распаковки файлов. GZIP был создан в 1992 году Жан-Лу Гейли и Марком Адлером как замена более ранних программ сжатия данных, таких как Compress. GZIP основан на алгоритме DEFLATE, который сочетает в себе методы LZ77 (Lempel-Ziv 1977) и кодирование Хаффмана для эффективного сжатия данных.
|
||||
|
||||
**Основные характеристики GZIP:**
|
||||
- **Эффективное сжатие**: GZIP обеспечивает высокую степень сжатия данных, что позволяет значительно уменьшить размер файлов, особенно текстовых.
|
||||
- **Скорость**: GZIP работает быстро и является эффективным как для сжатия, так и для распаковки данных.
|
||||
- **Поддержка различных форматов**: GZIP сжимает данные в формате .gz, но не сохраняет структуру файлов и директорий (для этого используются архиваторы вроде tar).
|
||||
- **Универсальность**: GZIP широко поддерживается в Unix-подобных системах (Linux, BSD), а также доступен на Windows и других платформах.
|
||||
- **Использование заголовков**: GZIP добавляет к сжатому файлу заголовок, который содержит метаданные, такие как имя оригинального файла, временная метка и контрольная сумма CRC32 для проверки целостности данных.
|
||||
|
||||
**Применения GZIP:**
|
||||
- **Сжатие файлов**: Используется для сжатия отдельных файлов, что экономит место на диске и уменьшает время передачи данных.
|
||||
- **Веб-технологии**: GZIP часто используется для сжатия веб-контента (HTML, CSS, JavaScript) перед отправкой с сервера на клиент, что ускоряет загрузку веб-страниц.
|
||||
- **Архивирование**: В Unix-подобных системах GZIP часто используется вместе с утилитой tar для создания архивов (tar.gz или .tgz), которые содержат несколько файлов и директорий.
|
||||
- **Протоколы передачи данных**: Протоколы, такие как HTTP и FTP, поддерживают сжатие GZIP для уменьшения объема передаваемых данных.
|
||||
|
||||
**Реализации:**
|
||||
- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]]
|
||||
- [[../../../../_inbox/GZIP сжатие в Nginx|GZIP сжатие в Nginx]]
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
|
||||
**Родитель**:: [[../fundamental/Сжатие данных|Сжатие данных]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
@ -14,9 +14,9 @@ linked:
|
||||
|
||||
Самый простой способ побороть эту проблему, это использовать fingerprint файла. То есть, когда файл меняется, вы меняете его название. Делается это обычно добавлением какого-нибудь префикса/суфикса к названию файла.
|
||||
|
||||
Например у нас есть файл стилей `style.css`, мы можем посчитать для него MD5 хэш и добавить его в название. Тогда у нас получится следующее название: `style.e626dd36e0085927f334adbe3eb38e7a.css`.
|
||||
Например у нас есть файл стилей `style.css`, мы можем посчитать для него [[../cryptography/MD5|MD5]] хеш и добавить его в название. Тогда у нас получится следующее название: `style.e626dd36e0085927f334adbe3eb38e7a.css`.
|
||||
|
||||
При любом изменении файла MD5 хэш должен пересчитываться. Таким образом при изменении файла у него будет другое название, и браузер будет вынужден скачать его в любом случае.
|
||||
При любом изменении файла [[../cryptography/MD5|MD5]] хеш должен пересчитываться. Таким образом при изменении файла у него будет другое название, и браузер будет вынужден скачать его в любом случае.
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]
|
||||
|
@ -26,7 +26,7 @@ Latency - это время, необходимое для выполнения
|
||||
- **Использование кэширования**: [[Кэширование]] часто запрашиваемых данных на сервере или ближе к клиенту может существенно сократить время доступа к этим данным, поскольку избавляет от необходимости каждый раз обращаться к основному источнику данных.
|
||||
- **Оптимизация базы данных**: Индексация, оптимизация запросов и структур данных, а также выбор подходящего типа базы данных могут снизить время доступа к данным
|
||||
- **Минимизация расстояния**: Размещение серверов ближе к конечным пользователям или использование сети доставки контента ([CDN](highload/Content%20Delivery%20Network.md)) может снизить физическую задержку, связанную с расстоянием, которое должны преодолеть данные.
|
||||
- **Сокращение объема передаваемых данных**: Минимизация размера данных, передаваемых между клиентом и сервером (например, сжатие данных и изображений), может уменьшить время их передачи.
|
||||
- **Сокращение объема передаваемых данных**: Минимизация размера данных, передаваемых между клиентом и сервером (например, [[../fundamental/Сжатие данных|сжатие данных]] и изображений), может уменьшить время их передачи.
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 HighLoad|00 HighLoad]]
|
||||
|
@ -25,9 +25,28 @@ linked:
|
||||
|
||||
Дополнительно для работы со статическими файлами можно отменить [[../Fingerprint|Fingerprint]].
|
||||
|
||||
Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари. При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика [[CacheMissRate]].
|
||||
## Инвалидация по TTL
|
||||
Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари.
|
||||
|
||||
Некоторые чувствительные данные нужно инвалидировать сразу при изменении. Тут может помочь тегирование ключей.
|
||||
При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика [[CacheMissRate]].
|
||||
|
||||
Если просто установить TTL, то спустя какое-то время он истечет и данные будут удалены, но что если к ним постоянно обращаются. В некоторых случаях я использую подход, при котором при запросе данных из кэша проверяется оставшийся TTL, и если он меньше, чем некоторое значение, то TTL устанавливается заново.
|
||||
|
||||
Данные остаются в кэше, если ими активно пользуются. В таком случае при обновлении данных, необходимо вручную положить новые данные или инвалидировать кэш по событиям.
|
||||
|
||||
```lua
|
||||
local key = KEYS[1];
|
||||
local threshold = tonumber(ARGV[1]);
|
||||
local new_ttl = tonumber(ARGV[2]);
|
||||
local value = redis.call('get', key);
|
||||
if value then
|
||||
local ttl = redis.call('pttl', key);
|
||||
if ttl >= 0 and ttl <= threshold then
|
||||
redis.call('pexpire', key, new_ttl);
|
||||
end;
|
||||
end;
|
||||
return value;
|
||||
```
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]
|
||||
|
61
dev/architecture/highload/Ключ кэширования.md
Normal file
61
dev/architecture/highload/Ключ кэширования.md
Normal file
@ -0,0 +1,61 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-13
|
||||
zero-link:
|
||||
- "[[../../../meta/zero/00 HighLoad|00 HighLoad]]"
|
||||
parents:
|
||||
- "[[Кэширование]]"
|
||||
linked:
|
||||
---
|
||||
Представим, что нам нужно кэшировать результат работы следующего метода:
|
||||
|
||||
```java
|
||||
public List<User> getUsersByType(String userType, Set<Long> userIds)
|
||||
```
|
||||
|
||||
Метод принимает 2 аргумента: строку и коллекцию. Ключ кэширования должен учитывать значения этих входящих аргументов и должен обладать следующими свойствами:
|
||||
- При изменении параметров, ключ кэширования также должен изменяться. В данном случае, если изменятся значения аргументов `userType` и `userIds`, мы должны получить новое значение ключа.
|
||||
- По параметрам ключ должен определяться однозначно, то есть для одних и тех же значений аргументов ключ кэширования должен принимать только одно значение. Иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки.
|
||||
|
||||
Сформируем ключ кэширования для нашего метода. В качестве хранилища будем использовать [[Redis]].
|
||||
|
||||
В начале ключа я обычно обязательно указываю какой-то уникальный префикс сервиса, чтобы не получить коллизию между разными сервисами. Пускай в данном случае префикс будет `USER_SERVICE`. Также добавляю уникальный префикс метода, в данном случае будет `USERS`.
|
||||
|
||||
В качестве разделителей рекомендую использовать `:`, в [[../../../../../_inbox/Redis|Redis]] это позволяет визуально сгруппировать ключи. Это позволяет визуально группировать ключи при использовании UI клиента. Таким образом начало нашего ключа выглядит следующим образом: `USER_SERVICE:USERS:`.
|
||||
|
||||
Значения аргументов метода также должны попасть в ключ. Возьмем наш первый аргумент `String userType`. Для аргумента также можно использовать префиксы, но это не обязательно. В данном случае пусть будет `USER_TYPE`. А вот для самого значения параметра есть несколько вариантов:
|
||||
- Оставить строкой и просто выполнить конкатенацию.
|
||||
- Использовать [[../../cryptography/Криптографическая хеш-функция|хеш-функцию]] с фиксированной длиной выхода, например [[../../cryptography/MD5|MD5]]. Фиксированная длина выхода нужна, чтобы иметь предсказуемую и ограниченную длину ключа.
|
||||
|
||||
Оставим просто строкой, так как тип пользователя вряд ли может быть длинным. В итоге пока наш ключ выглядит как-то так: `USER_SERVICE:USERS:USER_TYPE:VIP:`.
|
||||
|
||||
Переходим ко второму аргументу `Set<Long> userIds`. С коллекцией все будет сложнее. Мы точно должны использовать какую-нибудь [[../../cryptography/Криптографическая хеш-функция|хеш-функцию]], но как?
|
||||
|
||||
> [!WARNING] Disclamer
|
||||
> Этот способ я придумал сам, возможно он не самый удачный, но он работает. Если вы придумаете лучше, напишите в комментариях ниже 👇
|
||||
|
||||
Во-первых, коллекцию необходимо предварительно отсортировать. Иначе на одинаковые параметры коллекций мы будем получать разные результаты [[../../cryptography/Криптографическая хеш-функция|хеш-функции]].
|
||||
|
||||
Во-вторых, нужно представить коллекцию как что-то понятное для [[../../cryptography/Криптографическая хеш-функция|хеш-функции]]. Для этого я преобразую коллекцию в JSON. JSON используется, потому что ваша коллекция может быть из сложных объектов.
|
||||
|
||||
Теперь используем [[../../cryptography/SHA-256|SHA-256]], чтобы из нашей строки получить какой-то хеш. И уже этот хеш мы добавляем к нашему ключу, получается примерно такое:
|
||||
|
||||
```
|
||||
USER_SERVICE:USERS:USER_TYPE:VIP:USER_ID:315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
|
||||
```
|
||||
|
||||
> [!QUESTION] Почему SHA-256, а не MD5?
|
||||
> [[../../cryptography/MD5|MD5]] подвержен коллизиям, [[../../cryptography/SHA-256|SHA-256]] считается более устойчивым к коллизиям.
|
||||
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]
|
||||
**Родитель**:: [[../Кэширование|Кэширование]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-13]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
- [[../../snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]]
|
@ -13,7 +13,7 @@ linked:
|
||||
Обычно кэшируются только GET запросы, так как они должны быть [[../Идемпотентность|идемпотентны]].
|
||||
|
||||
Заголовки для кэширования:
|
||||
- ETAG. Тег, который позволяет указать версию файла. Можно использовать MD5.
|
||||
- ETAG. Тег, который позволяет указать версию файла. Можно использовать [[../../cryptography/MD5|MD5]].
|
||||
- If-Modified-Since. Дата изменения файла.
|
||||
- Cache-Control
|
||||
- public - Сохранять может не только браузер, но и промежуточные узлы
|
||||
|
@ -16,12 +16,12 @@ linked:
|
||||
> [!TIP] Работа без кэша
|
||||
> Хорошая система должна уметь выдерживать нагрузку и без кэша. Задача кэша ускорить ответ, а не держать нагрузку.
|
||||
|
||||
==Системы используемые для кэширования обычно не являются надежными, так что не следует хранить только там какие-то важные данные.== Чаще всего кэш реализуется на основе хэш-таблиц и использует [принцип локальности](../fundamental/Принцип%20локальности.md).
|
||||
|
||||
Сами данные можно разделить на несколько категорий:
|
||||
- **Можно потерять**. К этой категории относятся кэши выборок из базы данных. Потеря таких ключей не так страшна, потому что мы можем легко восстановить их значения, обратившись заново к backend’у. Однако частые потери кэшей приводят к излишним обращениям к БД.
|
||||
- **Не хотелось бы потерять**. Здесь можно упомянуть счетчики посетителей сайта, просмотров ресурсов и т.п. Хоть и восстановить эти значения иногда напрямую невозможно, но значения этих ключей имеют ограниченный по времени смысл: через несколько минут их значение уже неактуально, и будет рассчитано заново.
|
||||
- **Совсем не должны терять**. Кэш удобен для хранения сессий пользователей. Однако содержимое сессий не хотелось бы терять никогда – иначе пользователей на сайте будет «разлогинивать». Как попытаться избежать? Можно кластеризовать систему кэширования, так вероятность потери снижается.
|
||||
|
||||
==Системы используемые для кэширования обычно не являются надежными, так что не следует хранить только там какие-то важные данные.==
|
||||
## Уровни кэширования
|
||||
![](../../meta/files/images/Pasted%20image%2020240617195054.png)
|
||||
|
||||
@ -37,20 +37,14 @@ linked:
|
||||
- Сквозное. Все запросы проходят через кэш. [Схема](../../meta/files/images/Pasted%20image%2020240617194731.png).
|
||||
- Кэширование на стороне сервиса. [Схема](../../meta/files/images/Pasted%20image%2020240617194759.png).
|
||||
- Опережающее. Кладем данные в кэш заранее. [Схема](../../meta/files/images/Pasted%20image%2020240617194938.png).
|
||||
## Ключ кэширования
|
||||
Ключ кэширования должен обладать следующими свойствами:
|
||||
- При изменении параметров выборки, которую мы кэшируем, ключ кэширования должен изменяться (чтобы с новыми параметрами мы не «попали» в старый кэш).
|
||||
- По параметрам выборки ключ должен определяться однозначно, т.е. для одной и той же выборки ключ кэширования должен быть только один, иначе мы рискуем понизить эффективность процесса кэширования, создавая несколько кэшей для одной и той же выборки.
|
||||
|
||||
Можно использовать следующий вариант (пример для PHP): если существует некоторая точка в коде, через которую проходят все обращения к БД, а любое обращение полностью описывается (содержит все параметры запроса) в некоторой структуре `$options`, можно использовать следующий ключ:
|
||||
Чаще всего кэш реализуется на основе хеш-таблиц и использует [принцип локальности](../fundamental/Принцип%20локальности.md). Для работы с хеш-таблицей вам необходим [[highload/Ключ кэширования|ключ кэширования]] и сами данные. По ключу данные кладутся и забираются из таблицы.
|
||||
|
||||
```php
|
||||
$key = md5(serialize($options))
|
||||
```
|
||||
Для хранения результатов кэширования я обычно использую JSON. Использую для этого библиотеку [[../../../../knowledge/dev/java/other/Jackson|Jackson]], но есть один [[../../../../_inbox/Преобразование Json из коллекции в Java объект при помощи Jackson|нюанс при работе с коллекциям]], который стоит учитывать.
|
||||
|
||||
Такой ключ удовлетворяет первому условию: при изменении `$options` будет обязательно изменен `$key`, но и второе условие будет соблюдаться, если мы будем все типы данных в $options использовать «канонически», т.е. не допускать строки `"1"` вместо числа `1`. Функция `md5` используется для «сжатия» данных.
|
||||
При желании результат кэширования можно сжать используя [[../algorithm/GZIP|GZIP]]. Однако, приходится использовать [[../other/Base64|Base64]], чтобы преобразовать байты полученные от gzip в строку, и уже в таком виде положить в Redis. Не смотря на то, что Base64 увеличивает размер строки на 33% все равно получается намного компактнее, чем просто JSON.
|
||||
|
||||
Если мы закэшировали какие-то данные от backend’а, например, выборку из БД, рано или поздно исходные данные изменяются, и кэш перестает быть валидным. Причем очень желательно, чтобы кэш сбрасывался сразу же за изменением. За это отвечает [[highload/Инвалидация кэша|Инвалидация кэша]]
|
||||
Рано или поздно исходные данные изменяются, и кэш перестает быть валидным. Часто важно, чтобы кэш сбрасывался сразу же за изменением. За это отвечает [[highload/Инвалидация кэша|Инвалидация кэша]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 HighLoad|00 HighLoad]]
|
||||
|
45
dev/cryptography/MD5.md
Normal file
45
dev/cryptography/MD5.md
Normal file
@ -0,0 +1,45 @@
|
||||
---
|
||||
aliases:
|
||||
- Message Digest Algorithm 5
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
|
||||
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
|
||||
parents:
|
||||
- "[[Криптографическая хеш-функция]]"
|
||||
linked:
|
||||
---
|
||||
MD5 (Message Digest Algorithm 5) — это [[криптографическая хеш-функция]], которая преобразует входные данные в 128-битное (16-байтное) значение, называемое хешем или дайджестом сообщения.
|
||||
|
||||
|
||||
> [!DANGER]
|
||||
> Сегодня MD5 считается устаревшим и небезопасным для большинства криптографических приложений. В современных системах вместо MD5 рекомендуется использовать более безопасные алгоритмы, такие как [[SHA-256]] или SHA-3, которые обладают лучшей устойчивостью к коллизиям и другим атакам.
|
||||
|
||||
|
||||
Широко используется для проверки целостности данных и в других криптографических задачах.
|
||||
|
||||
**Основные характеристики MD5:**
|
||||
- **Фиксированная длина выхода**: Независимо от размера входных данных (например, текст или файл), хеш всегда имеет длину 128 бит (16 байт).
|
||||
- **Однонаправленность**: MD5 является однонаправленной функцией, что означает, что невозможно восстановить исходные данные по их хешу.
|
||||
- **Быстродействие**: MD5 работает быстро и эффективно, что сделало его популярным для использования в приложениях, где требуется быстрая обработка данных.
|
||||
|
||||
**Недостатки MD5:**
|
||||
- **Уязвимость к коллизиям**: MD5 подвержен коллизиям, что означает, что существует возможность найти два различных входа, которые дают одинаковый хеш. Это делает MD5 небезопасным для криптографических применений, таких как цифровые подписи и сертификаты.
|
||||
- **Атаки на предобраз**: Существуют методы, позволяющие найти вход, соответствующий заданному хешу, что еще больше подрывает надежность MD5.
|
||||
- **Низкая устойчивость к криптографическим атакам**: Со временем были разработаны более мощные алгоритмы, такие как [[SHA-256|SHA-256]] и SHA-3, которые обеспечивают лучшую безопасность по сравнению с MD5.
|
||||
|
||||
**Применения MD5:**
|
||||
- **Проверка целостности данных**: Используется для проверки целостности файлов и данных, например, в контексте загрузки программного обеспечения, где MD5 хеши публикуются вместе с файлами для проверки их целостности.
|
||||
- **Создание контрольных сумм**: MD5 был популярен для создания контрольных сумм файлов, чтобы быстро проверить, не были ли файлы изменены.
|
||||
- **Идентификаторы и хеширование строк**: MD5 использовался для создания уникальных идентификаторов и хеширования паролей (хотя сейчас это считается небезопасной практикой).
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]]
|
||||
**Родитель**:: [[Криптографическая хеш-функция]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
39
dev/cryptography/SHA-256.md
Normal file
39
dev/cryptography/SHA-256.md
Normal file
@ -0,0 +1,39 @@
|
||||
---
|
||||
aliases:
|
||||
- Secure Hash Algorithm 256-bit
|
||||
- SHA256
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
|
||||
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
|
||||
parents:
|
||||
- "[[Криптографическая хеш-функция]]"
|
||||
linked:
|
||||
---
|
||||
SHA-256 (Secure Hash Algorithm 256-bit) — это [[криптографическая хеш-функция]], которая преобразует входные данные в 256-битное (32-байтное) значение, называемое хешем. SHA-256 является частью семейства алгоритмов SHA-2.
|
||||
|
||||
**Основные характеристики SHA-256:**
|
||||
- **Фиксированная длина выхода**: Независимо от размера входных данных (например, файл, текст, строка), выход всегда имеет длину 256 бит (32 байта).
|
||||
- **Однонаправленность**: Хеш-функция является однонаправленной, что означает, что по хешу невозможно восстановить исходные данные.
|
||||
- **Устойчивость к коллизиям**: Вероятность нахождения двух различных входов, которые дают один и тот же хеш, чрезвычайно мала, что делает SHA-256 устойчивой к коллизиям.
|
||||
- **Устойчивость к предобразу**: Трудно найти вход, который соответствует заданному хешу.
|
||||
- **Быстродействие**: SHA-256 работает достаточно быстро для большинства приложений, включая цифровые подписи, контроль целостности данных и криптографические протоколы.
|
||||
|
||||
**Применения SHA-256:**
|
||||
- **Хранение паролей**: Хеширование паролей перед хранением для защиты от утечек данных.
|
||||
- **Контроль целостности данных**: Проверка целостности файлов или сообщений с помощью хеша.
|
||||
- **Криптовалюты**: SHA-256 используется в алгоритме доказательства работы (Proof-of-Work) в блокчейне Bitcoin.
|
||||
- **Цифровые подписи**: Используется для создания цифровых подписей, которые подтверждают подлинность и целостность сообщений.
|
||||
|
||||
**Реализации:**
|
||||
- [[../snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]]
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]], [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
|
||||
**Родитель**:: [[Криптографическая хеш-функция]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
26
dev/cryptography/Криптографическая хеш-функция.md
Normal file
26
dev/cryptography/Криптографическая хеш-функция.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
aliases:
|
||||
- хеш-функция
|
||||
- хеш-функцию
|
||||
- хеш функция
|
||||
- хеш функции
|
||||
- хеш-функции
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
- [[MD5]]
|
||||
- [[SHA-256]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Криптография|00 Криптография]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
21
dev/fundamental/Кодирование данных.md
Normal file
21
dev/fundamental/Кодирование данных.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
aliases:
|
||||
- кодирования данных
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
- [[../other/Base64|Base64]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
21
dev/fundamental/Сжатие данных.md
Normal file
21
dev/fundamental/Сжатие данных.md
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
- [[../algorithm/GZIP|GZIP]]
|
||||
- [[../snippet/Сжатие изображений без потери качества|Сжатие изображений без потери качества]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**::
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
@ -18,6 +18,10 @@ linked:
|
||||
Пример настройки в корневом `build.gradle`
|
||||
|
||||
```gradle
|
||||
plugins {
|
||||
id("org.kordamp.gradle.jandex") version "2.0.0"
|
||||
}
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
@ -31,6 +35,9 @@ buildscript {
|
||||
apply plugin: "org.kordamp.gradle.jandex"
|
||||
|
||||
subprojects {
|
||||
|
||||
apply plugin: "org.kordamp.gradle.jandex"
|
||||
|
||||
tasks.withType(Javadoc).configureEach {
|
||||
dependsOn('jandex')
|
||||
options.encoding = 'UTF-8'
|
||||
|
36
dev/other/Base64.md
Normal file
36
dev/other/Base64.md
Normal file
@ -0,0 +1,36 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Разработка|00 Разработка]]"
|
||||
parents:
|
||||
- "[[../garden/ru/dev/fundamental/Кодирование данных|Кодирование данных]]"
|
||||
linked:
|
||||
---
|
||||
Base64 — это метод [[../fundamental/Кодирование данных|кодирования данных]], который преобразует двоичные данные (например, файлы, изображения, или любой другой тип бинарных данных) в текстовый формат, используя набор из 64 символов (буквы латинского алфавита, цифры, а также символы + и /). Base64 часто используется для передачи данных через текстовые среды, такие как электронная почта или URL, где могут быть ограничения на использование двоичных данных.
|
||||
|
||||
**Основные характеристики Base64:**
|
||||
- **Кодирование и декодирование**: Base64 преобразует каждый триплет байтов (24 бита) входных данных в четыре символа (по 6 бит каждый). В случае, если количество байтов не кратно трём, на выход добавляются один или два символа = для заполнения.
|
||||
- **Читаемый текстовый формат**: Закодированные данные выглядят как обычный текст, состоящий из букв, цифр и нескольких специальных символов.
|
||||
- **Преобразование размера**: Закодированные Base64 данные увеличиваются в размере примерно на 33% по сравнению с исходными двоичными данными.
|
||||
- **Безопасность и надежность передачи**: Base64 кодирование не является средством защиты данных, оно не обеспечивает шифрования.
|
||||
|
||||
**Применения Base64:**
|
||||
- **Электронная почта (MIME)**: Используется для кодирования вложений в электронных письмах, чтобы их можно было безопасно передать через SMTP, который поддерживает только текст.
|
||||
- **Web**: Используется для передачи данных через URL или в JSON, а также для встраивания изображений и других медиафайлов в HTML и CSS.
|
||||
- **Кодирование API**: Используется для кодирования данных в API запросах, особенно когда нужно передать бинарные данные в JSON.
|
||||
- **Хранение данных**: В некоторых базах данных или конфигурационных файлах может быть удобно хранить бинарные данные в текстовом формате.
|
||||
|
||||
**Реализации:**
|
||||
- [[../snippet/Реализация Base64 на Java|Реализация Base64 на Java]]
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
|
||||
**Родитель**:: [[../fundamental/Кодирование данных|Кодирование данных]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
55
dev/snippet/Реализация Base64 на Java.md
Normal file
55
dev/snippet/Реализация Base64 на Java.md
Normal file
@ -0,0 +1,55 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
|
||||
parents:
|
||||
- "[[../other/Base64]]"
|
||||
linked:
|
||||
---
|
||||
|
||||
**Кодирование данных в Base64:**
|
||||
```java
|
||||
import java.util.Base64;
|
||||
|
||||
public class Base64EncodingExample {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Пример строки для кодирования
|
||||
String originalString = "This is a test string for Base64 encoding.";
|
||||
|
||||
// Кодирование строки в Base64
|
||||
String encodedString = Base64.getEncoder().encodeToString(originalString.getBytes());
|
||||
System.out.println("Encoded String: " + encodedString);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Декодирование данных из Base64:**
|
||||
```java
|
||||
import java.util.Base64;
|
||||
|
||||
public class Base64DecodingExample {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Пример закодированной строки Base64
|
||||
String encodedString = "VGhpcyBpcyBhIHRlc3Qgc3RyaW5nIGZvciBCYXNlNjQgZW5jb2Rpbmcu";
|
||||
|
||||
// Декодирование строки из Base64
|
||||
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
|
||||
String decodedString = new String(decodedBytes);
|
||||
System.out.println("Decoded String: " + decodedString);
|
||||
}
|
||||
}
|
||||
```
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
|
||||
**Родитель**:: [[../other/Base64|Base64]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
51
dev/snippet/Реализация SHA-256 на Java.md
Normal file
51
dev/snippet/Реализация SHA-256 на Java.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-09-14
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
|
||||
- "[[../../meta/zero/00 Криптография|00 Криптография]]"
|
||||
parents:
|
||||
- "[[../cryptography/SHA-256|SHA-256]]"
|
||||
linked:
|
||||
---
|
||||
Преобразование строки в [[../cryptography/SHA-256|SHA-256]]:
|
||||
|
||||
```java
|
||||
public class SHA {
|
||||
|
||||
public static String hashSha256(String data) {
|
||||
try {
|
||||
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||
byte[] encodedHash = digest.digest(data.getBytes(StandardCharsets.UTF_8));
|
||||
return bytesToHex(encodedHash);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException("Cannot find SHA-256 algorithm", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static String bytesToHex(byte[] hash) {
|
||||
final StringBuilder hexString = new StringBuilder();
|
||||
for (byte b : hash) {
|
||||
String hex = Integer.toHexString(0xff & b);
|
||||
if (hex.length() == 1) {
|
||||
hexString.append('0');
|
||||
}
|
||||
hexString.append(hex);
|
||||
}
|
||||
return hexString.toString();
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]], [[../../meta/zero/00 Криптография|00 Криптография]]
|
||||
**Родитель**:: [[../cryptography/SHA-256|SHA-256]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-09-14]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
@ -6,6 +6,7 @@ date: 2023-11-20
|
||||
zero-link:
|
||||
- "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]"
|
||||
parents:
|
||||
- "[[../../../../knowledge/dev/java/other/Jackson|Jackson]]"
|
||||
linked:
|
||||
---
|
||||
Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени `yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ` и изобретают свои форматы.
|
||||
@ -109,7 +110,7 @@ public class Foo {
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Снипеты для Java|00 Снипеты для Java]]
|
||||
**Родитель**::
|
||||
**Родитель**:: [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
|
||||
**Источник**::
|
||||
**Автор**::
|
||||
**Создана**:: [[2023-11-20]]
|
||||
|
@ -5,6 +5,7 @@ date: 2023-11-20
|
||||
zero-link:
|
||||
- "[[../../meta/zero/00 Снипеты на bash|00 Снипеты на bash]]"
|
||||
parents:
|
||||
- "[[../garden/ru/dev/fundamental/Сжатие данных|Сжатие данных]]"
|
||||
linked:
|
||||
---
|
||||
Размер изображений составляет существенную часть от размера страницы сайта. Поэтому часто я сжимаю изображения на своих сайтах. В этой заметке рассказываю какими способами я это делаю.
|
||||
@ -112,7 +113,7 @@ CPU time decode 1.074758, encode 16.759768, other 0.018592, total 17.899076 sec
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Снипеты на bash|00 Снипеты на bash]]
|
||||
**Родитель**::
|
||||
**Родитель**:: [[../fundamental/Сжатие данных|Сжатие данных]]
|
||||
**Источник**::
|
||||
**Автор**::
|
||||
**Создана**:: [[2023-11-20]]
|
||||
|
@ -9,13 +9,16 @@ title: Java разработка
|
||||
- [Устройство Java](Устройство%20Java.md)
|
||||
- [JDK](../../dev/java/JDK.md)
|
||||
- [[../../dev/java/Java Reflection|Java Reflection]]
|
||||
- [Снипеты для Java](00%20Снипеты%20для%20Java.md)
|
||||
- Системы сборки
|
||||
- [Maven](00%20Maven.md)
|
||||
- [[00 Gradle|Gradle]]
|
||||
- Фреймворки
|
||||
- [Quarkus](00%20Quarkus.md)
|
||||
- [SpringBoot](00%20SpringBoot.md)
|
||||
- Библиотеки
|
||||
- [Hibernate](00%20Hibernate.md)
|
||||
- [[../../../../knowledge/dev/java/other/Jackson|Jackson]]
|
||||
- [Снипеты для Java](00%20Снипеты%20для%20Java.md)
|
||||
## Мои рассуждения
|
||||
- [Использование wildcard imports в Java](../../dev/java/Использование%20wildcard%20imports%20в%20Java.md)
|
||||
- [Сравнение константы слева в Java](../../dev/java/Сравнение%20константы%20слева%20в%20Java.md)
|
||||
|
@ -6,4 +6,5 @@ date:
|
||||
parents:
|
||||
title: Криптография
|
||||
---
|
||||
- [[../../dev/cryptography/Криптографическая хеш-функция|Криптографическая хеш-функция]]
|
||||
- [Генерация аппаратного SSH ключа](../../dev/cryptography/Генерация%20аппаратного%20SSH%20ключа.md)
|
@ -5,15 +5,14 @@ title: Продуктивность
|
||||
linked:
|
||||
zero-link:
|
||||
---
|
||||
Будучи недовольны своей продуктивностью, первым делом мы задумываемся о том, где взять больше времени. Первое, что приходит на ум,— «тайм-менеджмент», или управление временем. К сожалению, мы редко принимаем во внимание прочие [ресурсы](Ресурсы%20человека.md), необходимые для решения задач.
|
||||
|
||||
Чтобы быть действительно продуктивным, необходимо сначала научиться работать с теми [ресурсами](../../../../knowledge/human/Ресурсы%20человека.md), что у вас есть:
|
||||
Будучи недовольны своей продуктивностью, первым делом мы задумываемся о том, где взять больше времени. Первое, что приходит на ум,— «тайм-менеджмент», или управление временем. К сожалению, мы редко принимаем во внимание прочие [ресурсы](Ресурсы%20человека.md), необходимые для решения задач:
|
||||
- [Мыслетопливо](../../../../knowledge/human/ресурсы/Мыслетопливо.md)
|
||||
- [Планирование](../../../../knowledge/human/ресурсы/Планирование.md)
|
||||
- [Мотивация](../../../../knowledge/human/other/Мотивация.md) / [Сила воли](../../../../knowledge/human/ресурсы/Сила%20воли.md)
|
||||
- [Внимание](../../../../knowledge/human/Внимание%20человека.md)
|
||||
|
||||
Конечно, нередко нам кажется, что заканчивается именно время, но на поверку это оказывается следствием опустошения бачка с [мыслетопливом](Мыслетопливо.md): сначала иссякает оно, потом вырубается [медленное мышление](Мышление%20по%20Даниэлю%20Канеману.md), как результат мы начинаем «тупить» и испытывать затруднения даже с элементарными вещами, делая их во много раз дольше обычного.
|
||||
Чтобы быть действительно продуктивным, необходимо научиться работать со всеми [ресурсами](../../../../knowledge/human/Ресурсы%20человека.md), что у вас есть: нужно научиться не расходывать их впустую, а также эффективно восстанавливать.
|
||||
## Заметки
|
||||
- Конечно, нередко нам кажется, что заканчивается именно время, но на поверку это оказывается следствием опустошения бачка с [мыслетопливом](Мыслетопливо.md): сначала иссякает оно, потом вырубается [медленное мышление](Мышление%20по%20Даниэлю%20Канеману.md), как результат мы начинаем «тупить» и испытывать затруднения даже с элементарными вещами, делая их во много раз дольше обычного.
|
||||
- Продуктивность не равняется времени потраченному на выполнение работы. Вы можете много работать и одновременно над несколькими задачами, но при этом быть контр-продуктивным.
|
||||
- [Бракованный день](../../productivity/Бракованный%20день.md)
|
@ -16,3 +16,7 @@ aliases:
|
||||
- [Логирование SQL в Hibernate](../../dev/java/hibernate/Логирование%20SQL%20в%20Hibernate.md)
|
||||
- [Бинарный поиск на Java](../../dev/java/Бинарный%20поиск%20на%20Java.md)
|
||||
- [[../../dev/snippet/Проблема с Hibernate Reactive в Telegram SDK для Java|Проблема с Hibernate Reactive в Telegram SDK для Java]]
|
||||
- [[../../dev/snippet/Реализация SHA-256 на Java|Реализация SHA-256 на Java]]
|
||||
- [[../../../../_inbox/Реализация GZIP в Java|Реализация GZIP в Java]]
|
||||
- [[../../dev/snippet/Реализация Base64 на Java|Реализация Base64 на Java]]
|
||||
- [[../../../../_inbox/Преобразование Json из коллекции в Java объект при помощи Jackson|Преобразование Json из коллекции в Java объект при помощи Jackson]]
|
Loading…
Reference in New Issue
Block a user