給你一個含有1億個QQ號碼的文件,如何快速的查找某個QQ號碼?

井迪迪迪迪迪


1億個QQ號碼的文本怎麼搜索

無序文本暴力搜索的不談,分享常用的兩個方法:

首要分析用途,檢索文本的關鍵詞要明晰,

假設:1、需要通過QQ號碼查找對應密碼等相關資料;

2、需要通過暱稱按地區分佈或年齡或性別羅列;

3、需要通過最近上網IP範圍羅列QQ號碼;

4、需要通過綁定郵箱或手機檢索

1、比較普通的做法:

整理文件,切割分區建立索引(QQ號、暱稱、郵箱、手機號碼),此法要依賴關係數據庫,記錄的添加和刪除得維護索引。分區後可進行分佈式多點協同作業。

2、同樣分區以方便添加刪除數據,然後建立QQ號碼bitmap文件(多文件,每個文件對應不同號碼區域),通過它可直接訪問對應位置QQ資料,這是一對一的關係。年齡可添加年度QQ集合文件,按年度建立QQ列表,結合MAP文件可快速羅列或更改刪減,地區也同樣。

而手機號碼和郵箱可能是一對多的關係,一個郵箱或手機號可綁定多個QQ號碼(如是一對一關係可同QQ號碼映射同法處理),這個處理起來就比較複雜,如不常用可依賴數據庫建立索引進行檢索,如常用,通常是多建個以號碼和郵箱為分區導向的集合,集合中只需存儲QQ號碼即可,如需更快,則可同樣建立映射文件,映射指向QQ號碼,但QQ號碼的映射中需要加個遊標進行維護。

總之,大數據處理要麼用存儲空間直接映射換取檢索時間,要麼就是根據需要合理分區,分佈多點協調作業,兩者可依實際應用結合進行。


不真實的影子


我來搗亂一下,1億個QQ號的文件,不用管他是怎麼存放,放在那都行。

然後你只要告訴我你要找的那個qq號,我就能立即告訴你你要找的QQ號是什麼。這個什麼算法都不用。

好吧話回正題,1億個QQ號,對應著什麼?用一個QQ號是要確定在不在這個文件當中,還是說,這個文件裡每個qq號都對應著一個暱稱,要得到這個暱稱呢?

這兩種算法是完全不一樣的,如果只需要確定是否存在,最價辦法應該是布隆過濾器,只需要構建一個信息指紋的大文件,通過集群,可以把速度縮減到毫秒級。

如果是找對應關係,之前的信息指紋就不行了,如果想夠快,依然需要一個集群,先按qq號的最大位數做一個大集合,然後把這1億個qq號按對應位置存入集合,最後把這個集合按0xFF分解到對應的機器上,查找時,只要把QQ號換算成地址,就可以直接訪問了,速也不慢,只是空間上比較浪費,實際做的時候,應該還會做一定的壓縮,以避免空間浪費,但這就需要使用cpu時間了,極限速度挑戰的話,應該不會用這個。


迷人的呆子


哈哈,我看了下都是扯犢子,什麼文本直接點開,你試過沒有。

我來給大家吹吹牛,大概是在15.16年左右,脫庫非常猖狂,網上流傳了各大網站平臺的註冊賬號數據庫,網易的,騰訊的,以及各種中小企業網站數據庫,比如YY,那時候360雲盤可以存40TB+的內容,我就逛各大黑客網站論壇,有幸蒐集了多達38T的數據庫資料以及視頻,只要洩露了,基本上都被收集了,大多數dat這些數據庫文件,需要******才能打開看,還有些是txt文件格式的,比如最出名的一個就是3億QQ賬號密碼那個文件,整個文件有幾G,如果按照其他答主的說法直接打開就行了,可以基本上點開就會卡死,打不開。

其實有很多種辦法可以打開,最簡單的一種,用****軟件切割,把一個txt文件分割為幾十個幾百個幾千個,比如分割為每個文件為100kb,或者把1開頭的分成一個文件,分為多個。這樣子你就能打開了,但是這樣子分割好之後不用打開,蒐集到一個目錄用*****彙總搜索自己需要的就行了。還有一種就是用SQL server這些打開。當然還有其他方法就不一一闡述。

好了牛吹完了360雲盤也封了給你們驗證不了。。。就當吹牛的吧


歡樂深圳


如果你學過信息理論,那麼根據信息熵值理論,對於無序的信息,任何查找算法都不可能比順序查找快.

所謂順序查找算法,就是挨個逐條比較,直到找到為止.

所以如果你只是查找一次,那麼就只有一個方法,挨個逐條比較。其他的所有方法都是扯淡. 這個早就有數學家作了詳細的分析研究,那些連基本算法常識都沒的人,就別扯淡了. 無序信息,除了順序查找,沒有更快的算法,想提高速度,只能想法提高算力(更塊的CPU,分佈式計算等等)

但是,如果你想製作一個查找的系統,最好的辦法就是對原始數據進行預處理,使原始數據形成結構化的有序數據。當數據有序化後,查找的效率就能大大的提高了,這個過程叫做索引.

一個最簡單的方法就是先把QQ號數據做一次排序,形成一個新按照大小順序排列的新文本.

針對於大小順序排列的數據,有二分法和插入法兩種可以提高速度得查找算法. 詳細實現請去網上查找.

其次,更有效的方法是把無序的原始數據,通過算法形成結構化的樹,然後再通過各種樹的遍歷萊進行查找.

常用的有二叉樹查找,平衡樹查找,紅黑樹查找等等.

其中紅黑樹是綜合新能最好,應用最廣泛的查找算法. 大家常見的數據庫中的查找算法,系統文件查找,一般都是紅黑樹算法.

上大學的時候,計算機專業有一門課叫算法與數據結構. 隨意請大家一定記住,算法和數據結構是密不可分的.


shawn25


布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。

基本思路如下:

如果想要判斷一個元素是不是在一個集合裡,一般想到的是將所有元素保存起來,然後通過比較確定。鏈表,樹等等數據結構都是這種思路. 但是隨著集合中元素的增加,我們需要的存儲空間越來越大,檢索速度也越來越慢(O(n),O(logn))。不過世界上還有一種叫作散列表(又叫哈希表,Hash table)的數據結構。它可以通過一個Hash函數將一個元素映射成一個位陣列(Bit array)中的一個點。這樣一來,我們只要看看這個點是不是1就可以知道集合中有沒有它了。這就是布隆過濾器的基本思想。

Hash面臨的問題就是衝突。假設Hash函數是良好的,如果我們的位陣列長度為m個點,那麼如果我們想將衝突率降低到例如 1%, 這個散列表就只能容納m / 100個元素。顯然這就不叫空間效率了(Space-efficient)了。解決方法也簡單,就是使用多個Hash,如果它們有一個說元素不在集合中,那肯定就不在。如果它們都說在,雖然也有一定可能性它們在說謊,不過直覺上判斷這種事情的概率是比較低的



互聯網說事兒


我看了很多小夥伴的回答都說的還不錯,但是很多都想當然的說的,我來說說真實案例,相信大家看了之後,對這一大類知識都有很全面的瞭解。

先科普一下QQ密碼為什麼會被洩露相關知識。只要是軟件和網站就會存在漏洞,當這個漏洞被發現的時候相關公司就會緊急修復,但是有時候這個漏洞沒有被發現或者只是個別的黑客發現沒有公佈出來,這個時候漏洞就叫0day漏洞。還有就是某些漏洞是沒辦法修復的,比如三次握手時候容易被抓取密碼,所以騰訊有時候也沒辦法避免有漏洞,所以也曾被脫褲。

大概是13年左右時候,騰訊曾遭到黑客攻擊,當然後面被緊急修復了。但是在這過程中大約有三億QQ賬號和密碼被脫褲(脫褲是隻黑客從竊取公司數據庫相關信息),至此在各大黑客論壇網站都流傳著一個3億QQ數據庫的文TXT文檔,這個文檔大約佔2G內存,裡面存在著3億qq和對應的明文密碼。這個是真實的,我有一個朋友也曾下載下來驗證證明是真實的。

以這個文件為例,查看最有效的方案有兩個。

1、txt文件切割,用txt文件切割器把這幾G文件切割成100kb/50kb文件,因為單獨一個幾G的TXT文件你用電腦肯定打不開的,一定會卡死。所以切割成幾十份幾百份才能進行查看,當分割成幾百份之後我們可以建立一個本地數據庫,道理很簡單,在自己電腦上新建一個文件夾,把這些切割好的txt文檔歸納到這個文件夾,再用txt搜索軟件**對這個文件夾進行搜索,比如搜索某個QQ,他就會出現相對應的QQ密碼,這樣子搭好了本地數據庫並對裡面的密碼進行了查看。

2、存數據庫,掛到mysql上。掛到mysql上之後我們就可以直接對數據庫進行查看,當然也就可以檢索某個數值了,甚至你還可以就行分類,比如1開頭的QQ分類,比如對6/78位數的QQ進行分類,分類的原因就是便於管理,甚至便於做壞事兒,比如6位數的qq人那大都是很久之前的大老闆了,再針對性的進行***,對吧,當然現在騰訊已經修復這個漏洞,你的密碼也強制性換了,所以也幾乎不存在因為這個原因你再被盜號的風險了。

對不起,太強的求生欲只能敘述成這樣,本來可以更加簡潔明瞭的解釋,但我怕犯了忌諱。不單單QQ曾被脫庫,流傳於世最出名的是QQ群關係這個數據庫,有了它之後,人肉就方便多了,只要通過搜索一個QQ就能查到這個人的同學群公司群興趣群等等,以此為媒介跳板,能查到大片大片的用戶。還有網易的、某某酒店的數據庫非常多,因為確實是沒有絕對安全的數據庫,也不能怪這些個公司。

在剛才寫完這篇回答之後,我又再去百度搜索相關褲子時候,沒想到輕鬆地就搜到了,我已舉報。請條友們不要去下載,沒有意義,說不定已經被掛馬了,當心中毒。瞭解網絡安全知識是為了更好的保護好自己,保護未來的生活中信息不被竊取,請條友們一定要珍重。




IT老胡


1億qq號,按照每個文qq號11位算,大概佔用1.02g空間,因為數據量不大,可以全加載進內存。這樣的話可以有好多方法。

第一種是內存映射文件,Windows內存映射文件可以映射磁盤上的大文件,別說1g,就算10g也沒問題,然後操作就跟在內存操作一樣,我之前試過500m的純文本(打印的π),用c語言函數strstr查找字符串就能秒得結果,1g跟500m區別不大。

第二種方法,同樣是建立在數據量不大的基礎上,可以構造map存在內存中qq號就是key,因為map基於hash預算,查詢效率非常高,也是秒得結果。

第三種存數據庫,因為數據達到億級,還是考慮oracle這種單表性能爆表的比較好,放mysql估計比較懸。

第四種可以用內存數據庫,如redis,其中key存為qq號,人家專業幹這個的,也是秒得結果。

第五種es,其實es幹這個有點大材小用。


清風14518071


一億QQ號數據量很少,如果平均10位,也就1G。找個好點的編輯器都能直接搜索。

如果要編程實現也容易。QQ號都是數字,而且最大也沒過32位,可以把QQ號轉成整數,也就佔400M內存。如果閒內存佔的多,可以用short int,也就佔200M內存。然後簡單的 qsort排序,二分法搜就可以了。


嘻嘻不哈


1億個QQ號,每個十位數字來算,一個long型夠了,8個字節,約800MB大小。

1、Server端內存就夠了,可以直接hash存儲,查找起來也快,紅黑樹結構

2、放在mysql數據庫內存儲,按照QQ號做10個sharding,將QQ號設置為索引,等值查詢,查起來也很快,B+樹結構

3、放在redis裡面,key值帶有QQ號標識,只佔用約800M存儲,查的時候看是否存在key值就行


用戶8564438213735


如果是隻查找一次,就用文本文件打開Ctrl+F。

如果以後需要經常查找,則採用以下方法:

第一步排序,自己開發一個排序函數。

第二步,採用折中法查找。一億個號碼,查找次數不會超過26次即可命中目標。

算法大概如下:

用數組裝入已排好序的數據。

第一步:獲取需要查找到號碼。

第二步:獲取數組第5000萬個(一億的中間)號碼進行對比。

第三步:如果比要查找的號碼大,則再取第7500萬個號碼(後半段的中間)進行比對。如果比要查找的號碼小,則取第2500萬個號碼(前半段的中間)進行比對。

第四步:按第三步的方法循環,直到找到目標號碼。

循環次數不會超過26次。


分享到:


相關文章: