Список вызовов в списке списка словаря не работает

Логика

В каждом из них есть разные списки с разными именами функций, например:

md5 = [gamma, alpha, beta, theta, delta]
sha1 = [alpha, beta, theta, delta]
sha256 = [alpha, beta, theta]
sha384 = [alpha, beta, theta]
sha512 = [alpha, beta, theta]

Это означает, что если функция для должна вызвать список мд5, то будут запущены все функции внутри списка md5.

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

hashdict = {}
hashdict['md5']     =  [ 'md5'    , 32  , md5    ]
hashdict['sha1']    =  [ 'sha1'   , 40  , sha1   ]
hashdict['sha256']  =  [ 'sha256' , 64  , sha256 ]
hashdict['sha384']  =  [ 'sha384' , 96  , sha384 ]
hashdict['sha512']  =  [ 'sha512' , 128 , sha512 ]

Функция

Эта функция принимает хэш, отправленный пользователем, проверяет, соответствует ли длина строки длине в любых списках словарей внутри hashdict{}. Если длина соответствует например: 32 символа, то это будет хэш md5.

После того, как скрипт узнает правильный список в словаре, он возьмет функцию (третий элемент списка — второй индекс списка) из конкретного списка в hashdict и передаст ее в вызов функции с именем API.

def crack(hashvalue):
    result = False
    hashInDict = False

    for hashList in list(hashdict.values()):
        if len(hashvalue) in hashList:
            hashInDict = True
            if not file:
                print(f'{info} Hash Function : {hashList[0].upper()}')
            for api in hashList[2]:
                r = api(hashvalue, hashList[0])
                if r:
                    return r
        else:
            if hashInDict == False:
                if not file:
                    print(f'{bad} This hash type is not supported.')
                    quit()
                else:
                    return False

Проблема

Это работает, только если хэш md5, а любой другой переданный хэш приводит к сообщению «Этот тип хэша не поддерживается». Как-то. если я удалю словарь и вместо этого использую if-else для сравнения длины хеш-строки, все работает нормально. Но использование списков словарей привело к тому, что все остальные хэши были проигнорированы, и работал только первый список словарей.

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

Я понятия не имею, почему он игнорирует что-либо после первого элемента списка словарей.

что такое hashdict? Пожалуйста, предоставьте весь соответствующий код, кажется, здесь недостаточно, чтобы сделать логическое предположение о том, что происходит и каким должен быть ожидаемый результат. Кроме того, вы не можете "call" список... Что вы имеете в виду под этим?

Jab 28.05.2019 05:52

Пожалуйста, добавьте ввод и желаемый вывод. Намного проще помочь.

Error - Syntactical Remorse 28.05.2019 15:48

@Jab >> Спасибо за ответ. Я отредактировал весь вопрос с соответствующим кодом. Основная идея заключается в том, что пользователь вводит хэш, затем скрипт определяет тип хеша по длине строки и соответственно запускает разный список функций для взлома каждого типа хеша.

newbieCoder 30.05.2019 07:52

@Error-SyntacticalRemorse >> Спасибо за ответ, я отредактировал весь вопрос с соответствующим кодом.

newbieCoder 30.05.2019 07:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы действительно слишком усложняете это, все, что вы, кажется, делаете, это если длина ввода соответствует заранее определенному числу, затем вызываете api, передавая введенную строку и список функций, а затем возвращаете ее значение, в противном случае возвращает False.

Просто сделайте диктовку, которая выглядит так:

hash_dict = {
    32: [gamma, alpha, beta, theta, delta],
    40: [alpha, beta, theta, delta],
    64: [alpha, beta, theta],
    96: [alpha, beta, theta],
    128: [alpha, beta, theta]
}

Затем в функции crack просто вызовите .get с помощью len(hash_value), и в dict он возвращает значение, в противном случае возвращает None или указанное значение по умолчанию.

def crack(hash_value):
    hash_list = hash_dict.get(len(hash_value))
    if hash_list:
        return api(hash_value, hash_list)
    return False

Здесь я делаю предположение относительно того, что делает api, но если это просто передача данных через каждую функцию в списке, то это легко сделать в crack. Вместо return api(hash_value, hash_list) используйте:

for func in hash_list:
    hash_value = func(hash_value)
return hash_value

Или, что еще лучше, просто поместите фактические методы в dict следующим образом (здесь я использую лямбда-выражения для экономии места, хотя я бы предложил фактические функции для удобства чтения):

hashdict = {
    32: lambda x: gamma(alpha(beta(theta(delta(x)))))
    40: lambda x: alpha(beta(theta, delta(x))),
    64: lambda x: alpha(beta(theta(x))),
    96: lambda x: alpha(beta(theta(x))),
    128: lambda x: alpha(beta(theta(x)))
}

Затем просто сделайте что-то вроде этого:

def crack(hash_value):
    def _default(_): False
    hash_func = hash_dict.get(len(hash_value), _default)
    return hash_func(hash_value)

Другие вопросы по теме