首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL查询中根据此条件找到类似的行百分比匹配?

如何在SQL查询中根据此条件找到类似的行百分比匹配?
EN

Stack Overflow用户
提问于 2020-04-12 10:56:57
回答 2查看 45关注 0票数 0

我有这样一个SQL表:

代码语言:javascript
复制
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中还有一个名为"query“(dictonary)的变量。字典键是MD5值,值是"BlockHash“。

如下所示:

代码语言:javascript
复制
{ "randommd55": ["randomstr1", "randomstr2", "randomstr1"] }

我的主要目标是:

我想搜索类似的文件。MD5值表示完整文件的MD5值。即使文件中有1位的差异,它也会改变.

对于每个文件,我随机获取1KB块并对它们进行散列。

现在,我有了一个由多个块哈希组成的查询字典。我想将查询块与SQL表中的文件进行比较。

我想看看查询文件和sql文件之间有多少块哈希匹配(MD5是每个文件的unqiue )。

例如:

md5=="randommd51“所在的文件有两个相同的块(randstr1,randstr2)。所以它是2/3 = 66.666%的匹配。

md5=="randommd52“所在的文件也有两个相同的块(randomstr1,randomstr2)。所以这是一个2/4,50%的匹配。请注意,randomstr2在此文件中重复两次。但它只在queryhash中重复了一次。因此,只有2/4匹配(50%)。

我想以一种快速的方式计算SQL中每个唯一MD5的百分比匹配。我将有数百万排

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-12 12:20:06

如果我正确理解,您希望获得与每个MD5匹配的块散列的比例:

代码语言:javascript
复制
select md5,
       avg( (blockhash in ('randomstr1', 'randomstr2', 'randomstr3') ) as matching_ratio
from t
group by md5
票数 1
EN

Stack Overflow用户

发布于 2020-04-12 12:11:03

如果我理解您的问题,对于您的md5字典中的每个query键/块列表值,您希望为该md5值计算数据库中块值匹配的百分比。

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61170325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档