4,552,350 th visitor since 2017.2.1 ( Today : 123 )
Programming
No. 473
Name. swindler
Subject. 제로보드 저장된 주민등록번호를 까보자 #2
Main Cate. Java
Sub Cate.
Date. 2008-09-17 14:33
Hit. 4750 (210.182.190.136)
File.
앞장에서 빠졌는데,
테이블은 대략 이렇게 만들었다.


create table zbtest
(
seq int primary key auto_increment,
ssn varchar(13) not null,
pssn varchar(64) not null
)


근데 나중에 해보니까 13자리 암호화하면 길이가 전부 41자로 나온다. (앞쪽 *는 포함해서....)
그리고 보니까 *는 빼고 하는게 더 빠를듯 하다.




막상 하고 나니까 글쓰기가 귀찮네.
대략 아래처럼 만들다 관뒀는데...

저놈의 루프가 조합이 좀 나오다보니까.
String, StringBuffer 으로 합치는건 뒤지게 느림.
그래서 변수를 몇개 더 놓고 최대한 적게 조합을 해야 될것 같은데,
문제는 MySQLPassword 자체도 꽤 시간이 많이 걸린다.

그 부분 튜닝을 하거나 안 되면 c로 개발을 하던가 (확실히 이런 연산은 자바가 느리다.)
해야 될듯 하다.

몇개 더 손봐야 될거는
5만개 데이터에서 맞는거 매칭하는것도 좀 걸릴듯 하니 sorting을 해서
binary search로 하는게 좋을듯 하고,

마지막 체크비트도 무식하게 하는것보다 좀더 세밀하게 해서 n값을 줄이는게 좋을듯.
게다가 성별 1,2,3,4도 적절히 계산을 하거나 미성년자 대충 빼고 1,2만 해도 될것 같고...

근데 아무리봐도 MySQLPassword 가 느리다. (첫번째 튜닝 포인트일듯...)


그리고 한번 실행해서 전체 데이터를 DB에 넣어두는게 (대략 10억건 단위로 나올듯) 나중을 위해서도 좋을듯 하다.

언제 심심하면 좀더 정리를 하던가 해야겠다.


--------------------------------------------------------------

package net.coolx.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import com.dnt7.common.DBConnection;
import com.dnt7.common.Log;

public class ZBPTest {

    private ArrayList data = new ArrayList();
    
    public static void main(String [] args)
    {
        ZBPTest zbpTest = new ZBPTest();
        
        zbpTest.loadData();
        
        zbpTest.find();
    }
    
    public void loadData()
    {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        String query = null;
        int loopCnt = 0;
        
        Log.print("start loading data");
        
        try
        {
            conn = DBConnection.getConnection();
            stmt = conn.createStatement();
            query = "select * from zbtest";
            
            rs = stmt.executeQuery(query);
            
            while(rs.next()) {

                loopCnt++;
                
                data.add(rs.getString("pssn"));        // ArrayList에 저장
                
                if(loopCnt%1000==0)
                    System.out.println(loopCnt+"\t : "+rs.getString("pssn"));
            }
            
        }catch(Exception e) {
        }finally {
            
            DBConnection.close(rs);
            DBConnection.close(stmt);
            DBConnection.close(conn);
        }
        
        Log.print("end loading data");

    }
    
    public void find()
    {
        long loopCnt = 0;
        StringBuffer sb = null;
        String ssn = null;
        
        for(int s12 = 0; s12<=99; s12++) {                // 년도 2자리 (0~99)
            for(int s34 = 1; s34<12; s34++) {            // 월 2자리 (1-12)
                for(int s56 = 1; s56<=31; s56++) {        // 일 2자리 (1-31)
                    
                    for(int n7 = 1; n7<=4; n7++) {                                // 뒷 1자리
                        for(int n8 = 0; n8<=9; n8++) {                            // 뒷 2자리
                            for(int n9 = 0; n9<=9; n9++) {                        // 뒷 3자리
                                for(int n10 = 0; n10<=9; n10++) {                // 뒷 4자리
                                    for(int n11 = 0; n11<=9; n11++) {            // 뒷 5자리
                                        for(int n12 = 0; n12<=9; n12++) {        // 뒷 6자리
                                            for(int n13 = 0; n13<=9; n13++) {    // 뒷 7자리 (역시 패리트비트이지만 귀찮아서 그냥 생성)
                                                
                                                loopCnt++;
                                                
                                                MySQLPassword.password("7609251904610");
                                                //sb = new StringBuffer();
                                                //ssn = sb.toString();
                                                /*
                                                ssn = "" + (s12<10 ? "0"+s12 : s12);
                                                ssn = ssn + (s34<10 ? "0"+s34 : s34);
                                                ssn = ssn + (s56<10 ? "0"+s56 : s56);
                                                
                                                ssn = ssn + (n7);
                                                ssn = ssn + (n8);
                                                ssn = ssn + (n9);
                                                ssn = ssn + (n10);
                                                ssn = ssn + (n11);
                                                ssn = ssn + (n12);
                                                ssn = ssn + (n13);
                                                */
                                                
                                                
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        Log.printTime();
                        System.out.println("loop4 : "+loopCnt+"\t : "+ssn);
                    }
                    Log.printTime();
                    System.out.println("loop3 : "+loopCnt+"\t : "+ssn);
                }
                Log.printTime();
                System.out.println("loop2 : "+loopCnt+"\t : "+ssn);
            }
            Log.printTime();
            System.out.println("loop1 : "+loopCnt+"\t : "+ssn);
        }
    }
}




[바로가기 링크] : http://coolx.net/cboard/develop/473



swindler MySQLPassword 는 손대지 않는다고 봤을때 단순 루프 돌려도 대략 15시간 나오는듯. 잘만들면 하루안에 쫑 나겠네 ^^ 2008-09-17
Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog