from argparse import ArgumentParser def parse_args(argv=None): ap = ArgumentParser( prog="app.py", description="CLI для лабораторной по хэшированию" ) sub = ap.add_subparsers(dest="cmd", required=True) # --- Общие группы --- common_variant = ArgumentParser(add_help=False) common_variant.add_argument("-v", "--variant", choices=["1", "2", "3"], required=True, help="Выбор варианта: 1=sin, 2=cos, 3=xor") common_salt = ArgumentParser(add_help=False) common_salt.add_argument("-s", "--salt", type=str, default="", help="Соль (по умолчанию пустая)") common_bytes = ArgumentParser(add_help=False) common_bytes.add_argument("--bytes", type=int, default=16, help="Количество значимых байтов хэша (по умолчанию 16)") # --- HASH --- sp_hash = sub.add_parser("hash", parents=[common_variant, common_salt, common_bytes], help="Посчитать хэш сообщения") sp_hash.add_argument("-m", "--message", type=str, default="", help="Сообщение (может быть пустым)") # --- AVALANCHE --- sp_av = sub.add_parser("avalanche", parents=[common_variant, common_salt, common_bytes], help="Тест эффекта лавины") sp_av.add_argument("-m", "--message", type=str, required=True, help="Базовое сообщение") # --- COLLISIONS --- sp_col = sub.add_parser("collisions", parents=[common_variant, common_bytes], help="Поиск коллизий (перебор)") sp_col.add_argument("--max-len", type=int, default=3, help="Максимальная длина сообщений (по умолчанию 3)") sp_col.add_argument("--alphabet", choices=["alnum", "alpha", "digits"], default="alnum", help="Алфавит: alnum[a-z0-9], alpha[a-z], digits[0-9]") # --- ANALYZE --- sp_an = sub.add_parser("analyze", parents=[common_variant, common_bytes], help="Анализ равномерности") sp_an.add_argument("--count", type=int, default=100, help="Сколько сообщений сгенерировать") sp_an.add_argument("--buckets", type=int, default=10, help="Сколько корзин для распределения (по умолчанию 10)") return ap.parse_args(argv)