Как проверить идентификационный номер через MD5?

Go дизайн

тема: Разработайте систему запроса удостоверения личности, сохраните номер удостоверения личности md5 и введите значение md5 для запроса соответствующего номера удостоверения личности.Требования: низкая стоимость, высокая скорость запросов

Идеи дизайна:

  1. Выполните простой статистический расчет количества данных для всех возможных идентификационных номеров.
  2. Выберите способ хранения в зависимости от объема данных
  3. Запрос

Правила генерации идентификатора:

Идентификационный номер представляет собой комбинированный код, состоящий из первых семнадцати цифр кода кузова и последней цифры контрольного кода. Порядок слева направо представляет собой шестизначный адресный код, восьмизначный код даты рождения, трехзначный код последовательности и однозначный контрольный код.

адресный код: Указывает код административной единицы округа (города, знамени, района), в котором находится постоянное место жительства объекта кодирования. Для новорожденных адресным кодом является код административной единицы места регистрации домохозяйства. Следует отметить, что при корректировке административных единиц возможны несоответствия кодов адресов для регистрации домовладений в одном и том же месте. Коды административного деления должны применяться в соответствии с положениями GB/T2260.

код даты рождения: указывает год, месяц и день рождения объекта кода. Между кодами года, месяца и дня нет разделителя. Формат ГГГГММДД, например 19880328. Выполнить в соответствии с положениями GB/T 7408. Код даты рождения в исходном 15-значном идентификационном номере также имеет особую идентификацию для долгожителей, из которых 999, 998, 997 и 996 присвоены долгожителям.

код последовательности: Обозначает порядковые номера, запрограммированные для людей, родившихся в один и тот же год, месяц и день в пределах области, обозначенной одним и тем же адресным кодом.Нечетное число порядкового кода назначается мужчинам, четное – женщинам.

проверить код: В соответствии с кодом кузова контрольный код рассчитывается с использованием системы контрольных кодов ISO 7064:1983, MOD 11-2. Алгоритм можно найти ниже. Ранее мы упоминали цифровой контрольный код, мы знаем, что контрольный код также имеет X, который по сути представляет собой латинский символ X, эквивалентный 10.

Алгоритм проверки кода

Умножьте цифры кода онтологии на соответствующий весовой коэффициент и просуммируйте, разделите на 11, чтобы получить остаток, и проверьте контрольный код по остатку по таблице сравнения контрольных кодов.

Таблица весовых коэффициентов:

+-----------------------------------------------------------+ 
|位置序号|1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|16|17| 
+-----------------------------------------------------------+ 
|加权因子|7 |9 |10|5 |8 |4 |2 |1 |6 |3 |7 |9 |10|5 |8 |4 |2 | 
+-----------------------------------------------------------+ 

Проверить кодовую таблицу:

+----------------------------------------------------+ 
| 余数  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 
+----------------------------------------------------+ 
| 校验码| 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2  | 
+----------------------------------------------------+ 

Пример алгоритма:

Код онтологии 11010519491231002

  • Шаг 1: Суммируйте произведения каждого числа и соответствующий весовой коэффициент 1*7+1*9+0*10+1*5+***=167.
  • Шаг 2: Разделите сумму на 11, чтобы получить остаток 167%11=2.
  • Третий шаг: по остатку 2 сравнить код проверки, чтобы получить X

** Таким образом, полный идентификационный номер: 11010519491231002X **

Предполагаемый объем данных:

  1. Идентификационный номер состоит из 18 цифр, первые шесть цифр — это код города, средние восемь цифр — это дата, последние три цифры — это порядковый код, а последняя цифра — это контрольная цифра, занимающая 32 байта.
  2. Значение md5 составляет 32 бита, занимая 32 байта.
  3. Рассчитайте данные за последние 100 лет, примерное количество данных:3465x100x365x999=126346027500
  4. Данные хранятся в виде строки, каждая часть данных32+18=50B
  5. Тогда количество данных равно `126346027500 x 50=6317301375000B=6169239624k=6024648M=5883G=5.74T`

Методы хранения включают хранилище файлов, хранилище реляционной базы данных и хранилище es. Из результатов видно, что имеется почти 6T данных, если они хранятся в базе данных или es.более высокая стоимость, здесь выберите сохранить как файл.

Есть ли способ сжать пространство для хранения?

  1. Последняя цифра номера удостоверения личности является контрольной цифрой, которую нельзя сохранить.Опуск этой цифры сэкономит 1/50 места.
  2. Вместо того, чтобы хранить его в виде строки, сохраните номер идентификатора как uint64, а значение md5 также преобразуется в два uint64 для хранения. uint64 занимает 8 байт, поэтому место для фрагмента данных уменьшено с 50 до 24. Конечный объем данных составляет 2,74 Тбайт, что позволяет сэкономить более половины места.

Итак, теперь возникает вопрос, насколько велик каждый файл?

Если файл слишком большой, чтение файла в память будет занимать много времени каждый раз.Если файл слишком маленький, будет создано слишком много файлов, что может превысить ограничение на количество файлов в системе.

Здесь вы можете обратиться к методу хранения индекса базы данных и установить размер каждого файла данных (данные 2,8T могут быть установлены примерно на 1G на файл данных.

Как сделать запрос после генерации данных?

  1. Обход, чтение файлов по очереди, поиск данных, эффективность слишком низкая
  2. Обратитесь к методу запроса индекса базы данных здесь.Сначала отсортируйте данные по значению md5 и сохраните несколько файлов, запишите диапазон значений md5 в каждом файле, введите значение md5 для определения файла, а затем прочитайте файл и используйте двоичный файл поиск.
  3. В настоящее время вам нужно только прочитать один файл, чтобы найти данные, но каждый файл содержит сотни мегабайт данных, а эффективность запроса все еще слишком низка.Пожалуйста, снова обратитесь к индексу базы данных.Индекс создается вместе с начальным значение собственной записи, а структура индекса показана на рисунке:

89b91ea63b15a762099ccc0a6fdaf412.png

Структура данных индекса:

# 为了简化存储,这里file1、file2、file3、file4 为该文件第一条数据的md5值,也是对应的文件名
# 页的大小固定,所以二级索引只需要按顺序记录每页的第一个md5值即可

indexes = { 
    "file1": ["md51", "md52", "md53", "..."],
    "file2": ["md51", "md52", "md53", "..."], 
    "file3": ["md51", "md52", "md53", "..."], 
    "file4": ["md51", "md52", "md53", "..."],  
} 

Индекс первого уровня — это индекс файла. Во-первых, значение md5 используется для определения файла, в котором находится значение md5. Например, если ввод start1 > md5 > start1, можно судить, что результат может быть в файл1;

Второй слой — это индекс в файле, значение md5 используется для определения страницы, на которой она находится, чтения всех данных страницы по смещению, а затем поиска соответствующего ID-номера через бинарный поиск.

Адрес источника реализации кода:GitHub.com/goosby/one P…

Как пользоваться:

1. go run main.go
2. curl http://127.0.0.1:8080/search?md5={id md5}

Ссылка на ссылку:


Наконец, поблагодарите мою девушку за ее поддержку и терпимость, чем ❤️

Вы также можете ввести следующие ключевые слова в официальном аккаунте, чтобы получить исторические статьи:公号&小程序 | 设计模式 | 并发&协程

扫码关注