给你一个含有1亿个QQ号码的文件,如何快速的查找某个QQ号码?

1

记得可以编一个程序,好像是找定点字的那种。我就是记不住,人真的很笨。

2

我来捣乱一下,1亿个QQ号的文件,不用管他是怎么存放,放在那都行。

然后你只要告诉我你要找的那个qq号,我就能立即告诉你你要找的QQ号是什么。这个什么算法都不用。

好吧话回正题,1亿个QQ号,对应着什么?用一个QQ号是要确定在不在这个文件当中,还是说,这个文件里每个qq号都对应着一个昵称,要得到这个昵称呢?

这两种算法是完全不一样的,如果只需要确定是否存在,最佳办法应该是布隆过滤器,只需要构建一个信息指纹的大文件,通过集群,可以把速度缩减到毫秒级。

如果是找对应关系,之前的信息指纹就不行了,如果想够快,依然需要一个集群,先按qq号的最大位数做一个大集合,然后把这1亿个qq号按对应位置存入集合,最后把这个集合按0xFF分解到对应的机器上,查找时,只要把QQ号换算成地址,就可以直接访问了,速也不慢,只是空间上比较浪费,实际做的时候,应该还会做一定的压缩,以避免空间浪费,但这就需要使用cpu时间了,极限速度挑战的话,应该不会用这个。

3

方法1,

微秒级查询方法,假设现在QQ号共10位数,声明一个Bitmap,大小99亿,每个bit只存0或1,读取文件,QQ号作为下标设置,如果对应位置的标记为0设置为1。某号码X,只需要判断下标位置X的标记是否为1即可


方法2,

节省内存的方法,创建一个文件共99亿行,每行一个换行符,读取QQ文件号码,用java中随机文件访问类,直接定位到对应行,写入QQ号,依次写完,待查X号码,类似定位方法,判定位置处内容是否是换行符

4

最简单的,grep命令搞定。想加快,先split,再并行跑多个grep。另外一个办法,perl脚本,先把整个文件读入内存,在内存里操作速度很快,再一条条比对。qq号只有十多位,按16位算,16字节,3亿为48亿字节,大约4.8GB,对服务器来说小case

5

我看了很多小伙伴的都说的还不错,但是很多都想当然的说的,我来说说真实案例,相信大家看了之后,对这一大类知识都有很全面的了解。

先科普一下QQ密码为什么会被泄露相关知识。只要是软件和网站就会存在漏洞,当这个漏洞被发现的时候相关公司就会紧急修复,但是有时候这个漏洞没有被发现或者只是个别的黑客发现没有公布出来,这个时候漏洞就叫0day漏洞。还有就是某些漏洞是没办法修复的,比如三次握手时候容易被抓取密码,所以腾讯有时候也没办法避免有漏洞,所以也曾被脱裤。

大概是13年左右时候,腾讯曾遭到黑客攻击,当然后面被紧急修复了。但是在这过程中大约有三亿QQ账号和密码被脱裤(脱裤是只黑客从窃取公司数据库相关信息),至此在各大黑客论坛网站都流传着一个3亿QQ数据库的文TXT文档,这个文档大约占2G内存,里面存在着3亿qq和对应的明文密码。这个是真实的,我有一个朋友也曾下载下来验证证明是真实的。

以这个文件为例,查看最有效的方案有两个。

1、txt文件切割,用txt文件切割器把这几G文件切割成100kb/50kb文件,因为单独一个几G的TXT文件你用电脑肯定打不开的,一定会卡死。所以切割成几十份几百份才能进行查看,当分割成几百份之后我们可以建立一个本地数据库,道理很简单,在自己电脑上新建一个文件夹,把这些切割好的txt文档归纳到这个文件夹,再用txt搜索软件**对这个文件夹进行搜索,比如搜索某个QQ,他就会出现相对应的QQ密码,这样子搭好了本地数据库并对里面的密码进行了查看。

6

反正也就查一个号码,我就crtl +F慢慢找呗,你们写好代码,我估计也就查到了

7

qq号码其实就是long类型,数据库以long类型作为非自增主键,建立1024张表,表名为qq_(0-1023),用qq号码除1024得到余数范围为0-1023,根据余数查表,然后再根据主键查qq号,查找效率,应该在10ms以内。附加:qq号除1024的余数=qq号 & 1023,qq号用整形比较运算效率最高,用数据库主键是因为聚合索引查找效率最高。

8

弱弱的问句各位大神,我在键盘上Ctrl+F,输入要查的号码,然后回车键,用时不超过4秒,是不是显得我特别没技术啊??

9

如果你学过信息理论,那么根据信息熵值理论,对于无序的信息,任何查找算法都不可能比顺序查找快.

所谓顺序查找算法,就是挨个逐条比较,直到找到为止.

所以如果你只是查找一次,那么就只有一个方法,挨个逐条比较。其他的所有方法都是扯淡. 这个早就有数学家作了详细的分析研究,那些连基本算法常识都没的人,就别扯淡了. 无序信息,除了顺序查找,没有更快的算法,想提高速度,只能想法提高算力(更块的CPU,分布式计算等等)

但是,如果你想制作一个查找的系统,最好的办法就是对原始数据进行预处理,使原始数据形成结构化的有序数据。当数据有序化后,查找的效率就能大大的提高了,这个过程叫做索引.

一个最简单的方法就是先把QQ号数据做一次排序,形成一个新按照大小顺序排列的新文本.

10

特征分类,例如无重复,继续区分分类,1开始,2开始等等,再进一步区分结尾数字,还可以再次看其它位的数字,等等,有重复,2位重复,3位重复,10位重复,等等,一个数字重复,2个数字重复,等等,这样,经过区分,每种类型的号码,控制在千个一下,这样,检索一个号码,很快的,也就是树状检索的方法,

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章