Как сделать это в запросе SQL, найти похожие процентные совпадения строк на основе этого условия? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть SQL Таблица, подобная этой:

MD5                         BlockHash
randommd51                  randstr1
randommd51                  randstr2
randommd51                  randstr3
randommd52                  randstr2
randommd52                  randstr2
randommd52                  randstr1
randommd52                  randstr7
randommd53                  randstr2
randommd53                  randstr1
randommd53                  randstr2
randommd53                  randstr3
randommd54                  randstr4
randommd54                  randstr55

У меня есть другая переменная в Python, которая называется «запрос» (диктонарная). Ключом словаря является значение MD5, а значениями являются «BlockHa sh».

Например:

{ "randommd55": ["randomstr1", "randomstr2", "randomstr1"] }

Моя главная цель:

Я хочу найти похожие файлы. Значение MD5 представляет полное значение MD5 файла. Это изменится, даже если в файле есть 1-битная разница.

Для каждого файла я беру случайные блоки размером 1 КБ и х sh их.

Итак, у меня есть словарь запросов, состоящий из нескольких блоков ha sh. Я хочу сравнить запрос blockha sh с файлами внутри таблицы SQL.

Я хочу посмотреть, сколько блоков sh совпадают между файлом запроса и файлами sql (MD5 не является обязательным для каждого файла).

Например:

Файл, в котором md5 == "randommd51" находится, имеет 2 общих блока sh (randstr1, randstr2). Таким образом, это 2/3 = 66,666% совпадений

Файл, в котором md5 == "randommd52" находится, также имеет 2 общих блока sh (randomstr1, randomstr2). Так что это 2/4, 50% матча. Обратите внимание, что randomstr2 повторяется два раза в этом файле. Но это повторяется только 1 раз в queryha sh. Таким образом, это всего лишь 2/4 совпадения (50%).

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

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

select md5,
       avg( (blockhash in ('randomstr1', 'randomstr2', 'randomstr3') ) as matching_ratio
from t
group by md5
0 голосов
/ 12 апреля 2020

Если я понимаю ваш вопрос, для каждого ключа / блокады md5 sh значения списка в вашем словаре query вы хотите рассчитать процент совпадений значений blockha sh в базе данных для этого значения md5.

def flatten(items):
    for x in items:
        if isinstance(x, (list, tuple)):
            yield from flatten(x)
        else:
            yield x

query =  { "randommd55": ["randomstr1", "randomstr2", "randomstr1"] } # plus other key, value entries

for md5, blockhash_list in query.items():
    set1 = set(blockhash_list) # set of blockhash values in query
    # conn is database connection using perhaps pymysql
    cursor = conn.cursor()
    cursor.execute('select BLOCKHASH from the_table where MD5 = %s', (md5,))
    set2 = set(flatten(cursor.fetchall())) # set of blockhash values on database for this md5
    # do we need to test for an empty set2; we don't want to divide by zero?
    l = len(set2)
    if l == 0:
        print('md5 {} does not exist on the database.'.format(md5))
    else:
        fraction = len(set1 & set2) / l
        print('md5 = {}, percentage = {:.3}'.format(md5, fraction))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...