2021-05-19 10:01:39
Какая связь у UUID и MD5?#architecture
Вчера был опубликован types/node@14.17.0. Теперь typescript проекты могут использовать
crypto.randomUUID, который возвращает 4-ую версию uuid. Отличный повод поговорить, что общего у MD5 и UUID.
MD5 это хэш файла и используется для проверки, что файл не был поврежден в ходе загрузки. UUID это случайный идентификатор вида
63f04799-4bc1-4101-be08-263306e7b6ae.UUID имеет длину 128 бит и столь низкий шанс повтора, что его можно считать уникальным. Хеш MD5 тоже имеет длину 128 бит, но и не гарантирует уникальности, а только имеет низкую вероятность коллизии. Из-за наличия коллизий его часто критикуют, ведь он подвержен birthday-атаке.
На одном из проектов, с хранением видео файлов использовали MD5 для нахождения дубликатов и случайный UUID как первичный ключ в БД. То есть использовались два 128-ми битных ключа. Один хранился как uuid, второй как строка. Использование MD5 как UUID позволил сохранить структура данных такой же, но убрать информационную избыточность.
Вот пример кода:
export function md5_to_uuid(md5: string): string {
if (typeof md5 !== 'string') throw Error('md5 should be string');
if (!/^[a-f0-9]{32}$/.test(md5)) throw Error('Wrong md5 format');
return `${md5.substring(0, 8)}-${md5.substring(8, 12)}-${md5.substring(12, 16)}-${md5.substring(16, 20)}-${md5.substring(20)}`;
}
export function uuid_to_md5(uuid: string): string {
return uuid.replace(/-/g, '');
}
В завершение хочу сказать спасибо @Jek_Rock, за нахождение ошибок в первой версии рецепта.
606 viewsedited 07:01