1. 程式人生 > >86.八千萬qq密碼按相似度排序並統計密碼出現次數,生成密碼庫

86.八千萬qq密碼按相似度排序並統計密碼出現次數,生成密碼庫

關閉 tdi 文件的 寫入文件 spa body qsort def string

  • 存儲qq的文件地址以及按照密碼相似度排序的文件地址
    1 //存儲qq的文件的地址
    2 char path[512] = "QQ.txt";
    3 //按照密碼相似度排序的文件地址
    4 char pathsortbypass[512] = "QQpasswordsort.txt";

  • 標識qq一共有多少行
    1 //文件一共有多少行
    2 #define N  84331446

  • 創建結構體存儲密碼,並把文件載入內存
    1 //密碼信息
    2 struct info
    3 {
    4     char str[17];
    5 };
    6 
    7 //指向所有結構體的指針
    8 struct info *pall = NULL;
     1 //初始化
     2 void init()
     3 {
     4     //記錄時間
     5     time_t start, end;
     6     time(&start);
     7 
     8     pall = calloc(N, sizeof(struct info));//分配內存
     9     if (pall==NULL)
    10     {
    11         puts("calloc fail");
    12         return;
    13     }
    14     //打開文件
    15     FILE *pf = fopen(path, "r");
    16     
    17     //
    依次讀取 18 for (int i = 0; i <N; i++) 19 { 20 char str[50] = { 0 }; 21 fgets(str, 50, pf); 22 char *pfind = strstr(str, "----"); 23 //每行格式123----qweqe 24 if (pfind !=NULL) 25 { 26 int length = strlen(pfind + 4); 27 //刷掉非法密碼 28 if
    (length<17) 29 { 30 //拷貝字符串 31 strcpy(pall[i].str, pfind + 4); 32 } 33 } 34 } 35 //關閉文件 36 fclose(pf); 37 time(&end); 38 printf("文件讀取話費%f秒\n", difftime(end, start)); 39 }

  • 按照相似度快速排序
     1 //快速排序比較函數,比較兩個結構體
     2 int com(void *p1, void *p2)
     3 {
     4     struct info *pinfo1 = p1;
     5     struct info *pinfo2= p2;
     6     return strcmp(pinfo1->str, pinfo2->str);//排序的函數
     7 }
     8 
     9 //排序
    10 void sort()
    11 {
    12     //記錄時間
    13     time_t start, end;
    14     time(&start);
    15 
    16     //快速排序
    17     qsort(pall, N, sizeof(struct info), com);
    18 
    19     time(&end);
    20     printf("排序話費%f秒\n", difftime(end, start));
    21 }

  • 寫入文件
     1 //寫入文件
     2 void writetofile()
     3 {
     4     //存儲時間
     5     time_t start, end;
     6     //開始時間
     7     time(&start);
     8     //以寫的方式打開文件
     9     FILE *pf = fopen(pathsortbypass, "w");
    10     //判斷每一個
    11     for (int  i = 0; i < N; i++)
    12     {
    13         //格式 5----pass
    14         char allstr[100] = { 0 };
    15         //存儲密碼
    16         char istr[100] = { 0 };
    17         strcpy(istr, pall[i].str);//拷貝備份
    18 
    19         int j = 1;//出現一次
    20         //循環直到最後一個不相等
    21         while (strcmp(pall[i].str,pall[i+1].str)==0)
    22         {
    23             i++;//循環前進
    24             j++;//計數
    25         }
    26         //合成字符串寫入
    27         sprintf(allstr, "%d----%s", j, istr);
    28         //寫入到文件
    29         fputs(allstr, pf);
    30     }
    31 
    32     //關閉文件
    33     fclose(pf);
    34 
    35     //結束
    36     time(&end);
    37 
    38     printf("排序花費%f秒\n", difftime(end, start));
    39 }

  • 獲取文件有多少行
     1 //獲取文件有多少行
     2 int getN(char *path)
     3 {
     4     int i = 0;
     5     FILE *pf = fopen(path, "r");
     6     if (pf==NULL)
     7     {
     8         return -1;
     9     }
    10     else
    11     {
    12         while (!feof(pf))
    13         {
    14             char str[50] = { 0 };
    15             fgets(str, 50, pf);
    16             i++;
    17         }
    18         
    19         fclose(pf);
    20         return i;
    21     }
    22 }

  • 主函數
     1 //主函數
     2 void main()
     3 {
     4     //初始化載入到內存
     5     init();
     6     //密碼相似度排序
     7     sort();
     8     //寫入文件
     9     writetofile();
    10     system("pause");
    11 }

完整代碼

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<time.h>
  6 
  7 //存儲qq的文件的地址
  8 char path[512] = "QQ.txt";
  9 //按照密碼相似度排序的文件地址
 10 char pathsortbypass[512] = "QQpasswordsort.txt";
 11 //文件一共有多少行
 12 #define N  84331446
 13 
 14 //密碼信息
 15 struct info
 16 {
 17     char str[17];
 18 };
 19 
 20 //指向所有結構體的指針
 21 struct info *pall = NULL;
 22 
 23 //寫入文件
 24 void writetofile()
 25 {
 26     //存儲時間
 27     time_t start, end;
 28     //開始時間
 29     time(&start);
 30     //以寫的方式打開文件
 31     FILE *pf = fopen(pathsortbypass, "w");
 32     //判斷每一個
 33     for (int  i = 0; i < N; i++)
 34     {
 35         //格式 5----pass
 36         char allstr[100] = { 0 };
 37         //存儲密碼
 38         char istr[100] = { 0 };
 39         strcpy(istr, pall[i].str);//拷貝備份
 40 
 41         int j = 1;//出現一次
 42         //循環直到最後一個不相等
 43         while (strcmp(pall[i].str,pall[i+1].str)==0)
 44         {
 45             i++;//循環前進
 46             j++;//計數
 47         }
 48         //合成字符串寫入
 49         sprintf(allstr, "%d----%s", j, istr);
 50         //寫入到文件
 51         fputs(allstr, pf);
 52     }
 53 
 54     //關閉文件
 55     fclose(pf);
 56 
 57     //結束
 58     time(&end);
 59 
 60     printf("排序花費%f秒\n", difftime(end, start));
 61 }
 62 
 63 
 64 //快速排序比較函數,比較兩個結構體
 65 int com(void *p1, void *p2)
 66 {
 67     struct info *pinfo1 = p1;
 68     struct info *pinfo2= p2;
 69     return strcmp(pinfo1->str, pinfo2->str);//排序的函數
 70 }
 71 
 72 //排序
 73 void sort()
 74 {
 75     //記錄時間
 76     time_t start, end;
 77     time(&start);
 78 
 79     //快速排序
 80     qsort(pall, N, sizeof(struct info), com);
 81 
 82     time(&end);
 83     printf("排序話費%f秒\n", difftime(end, start));
 84 }
 85 
 86 //初始化
 87 void init()
 88 {
 89     //記錄時間
 90     time_t start, end;
 91     time(&start);
 92 
 93     pall = calloc(N, sizeof(struct info));//分配內存
 94     if (pall==NULL)
 95     {
 96         puts("calloc fail");
 97         return;
 98     }
 99     //打開文件
100     FILE *pf = fopen(path, "r");
101     
102     //依次讀取
103     for (int i = 0; i <N; i++)
104     {
105         char str[50] = { 0 };
106         fgets(str, 50, pf);
107         char *pfind = strstr(str, "----");
108         //每行格式123----qweqe
109         if (pfind !=NULL)
110         {
111             int length = strlen(pfind + 4);
112             //刷掉非法密碼
113             if (length<17)
114             {
115                 //拷貝字符串
116                 strcpy(pall[i].str, pfind + 4);
117             }
118         }
119     }
120     //關閉文件
121     fclose(pf);
122     time(&end);
123     printf("文件讀取話費%f秒\n", difftime(end, start));
124 }
125 
126 
127 //獲取文件有多少行
128 int getN(char *path)
129 {
130     int i = 0;
131     FILE *pf = fopen(path, "r");
132     if (pf==NULL)
133     {
134         return -1;
135     }
136     else
137     {
138         while (!feof(pf))
139         {
140             char str[50] = { 0 };
141             fgets(str, 50, pf);
142             i++;
143         }
144         
145         fclose(pf);
146         return i;
147     }
148 }
149 
150 
151 //主函數
152 void main()
153 {
154     //初始化載入到內存
155     init();
156     //密碼相似度排序
157     sort();
158     //寫入文件
159     writetofile();
160     system("pause");
161 }

86.八千萬qq密碼按相似度排序並統計密碼出現次數,生成密碼庫