Как искать таблицу текстовых файлов в Python? - PullRequest
0 голосов
/ 27 марта 2019

Я создаю радужную таблицу со строками и хэшами, разделенными пробелами в таблице.Радужная таблица выглядит следующим образом:

j)O 3be44b195706cdd25e29d2b01a0e88d4
j)P a83079350701398672677a9ffe07108c
j)Q 2952c4654c127f2bb1086b75d8f1f986
j)R 6621ec6e1ba3c3669259894db8cde339
j)S 0442a2ee045e1913cd2eb094e8945399

Я хочу знать, как я могу сделать программу на Python для поиска строки и поиска хеша или наоборот.

Я сделал этопоиск по всему документу, но я хочу, чтобы он выполнял поиск только по определенному столбцу.

Я использовал panda, и теперь я могу выполнять поиск по определенному столбцу, но я хочу, чтобы он только находил точные совпадения:

working_table = pd.read_csv('rainbow_table_md5.txt', sep = ' ', names=["string", "hash"])
print(working_table['hash'].where(working_table['string'] == input(colored("String: ", 'cyan'))))

Код прямо сейчас выводит это:

String: a
0           0cc175b9c0f1b6a831c399e269772661
1                                        NaN
2                                        NaN

                          ...               
14094701                                 NaN
14094702                                 NaN

Name: hash, Length: 14094731, dtype: object

Мне не нужны все другие строки, кроме соответствия в строке 0

В идеале мне нужен только хеш, каквыход.

1 Ответ

0 голосов
/ 27 марта 2019

Вы хотите «поиск», а не «поиск», так как имеет значение только точное соответствие. Панды могут быть излишними для этого приложения. Достаточно пары словарей:

class Rainbow:

    def __init__(self, infile, k=20):
        self.s_to_hash = {s: hash
                          for s, hash in self._read_tuples(infile)}
        self.hash_to_s = {hash[:k]: s
                          for s, hash in self.s_to_hash.items()}
        self.k = k

    @staticmethod
    def _read_tuples(infile):
        with open(infile) as fin:
            for line in fin:
                s, hash = line.strip().split()
                yield s, hash

Выбор k < 32 - это попытка сэкономить некоторую память с риском (небольшого) коллизии хэшей на основе их общего префикса. Настройте его на вкус, в зависимости от вашей памяти, размера стола и склонности к риску столкновения. Попробуйте написать функцию получения и затем сделать hash_to_s приватным.

Хранение байтов потребляет вдвое больше памяти, чем хранение шестнадцатеричных битов ascii.

...