2011-09-24 4 views
0

java에 에 대해 unique order number을 생성해야합니다. time of creation of order은 충분히 고유 한 값이라고 생각했습니다. Two orders cannot be created at the same second. 다른 사람이 주문 번호를 사용하지 못하도록 일부 생성 시간 값을 추측하여 작성 시간 문자열의 hash 부분을 추가하여 최종 주문 번호 문자열로 만들었습니다. 창조의 시간을 기준으로 주문 번호를 생성 고객의 주문에 대해 고유하면서도 주문 된 주문 번호를 만들려면

이 방법에 어떤 보이지 않는 함정이 있습니까

은? 시스템에서 생성 된 주문에 대해 약간의 정렬 순서를 제공하기위한되었다 .. 코드는

public static String createOrderNumber(Date orderDate) throws NoSuchAlgorithmException { 
     DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
     String datestring = df.format(orderDate).toString(); 
     System.out.println("datestring="+datestring); 
     System.out.println("datestring size="+datestring.length()); 
     String hash = makeHashString(datestring);//creates SHA1 hash of 16 digits 
     System.out.println("hash="+hash); 
     System.out.println("hash size="+hash.length()); 
     int datestringlen = datestring.length(); 
     String ordernum = datestring+hash.substring(datestringlen,datestringlen+5); 
     System.out.println("ordernum size="+ordernum.length()); 
     return ordernum; 
    } 

    private static String makeHashString(String plain) throws NoSuchAlgorithmException { 
     final int MD_PASSWORD_LENGTH = 16; 
     final String HASH_ALGORITHM = "SHA1"; 
     String hash = null; 
     try { 
       MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM); 
       md.update(plain.getBytes()); 
       BigInteger hashint = new BigInteger(1, md.digest()); 
       hash = hashint.toString(MD_PASSWORD_LENGTH); 
      } catch (NoSuchAlgorithmException nsae) { 
       throw(nsae); 
      } 
     return hash; 
    } 
여기 주어진다

샘플 출력은

datestring=20110924103251 
datestring size=14 
hash=a9bcd51fc69d9225c5d96061d9c8628137df14e0 
hash size=40 
ordernum size=19 
ordernum=2011092410325125c5d 
+0

* "두 번째 주문은 동일한 초에 만들 수 없습니다."* 서버가 초당 20 주문을 처리하는 경우 가능합니다. –

답변

1

입니다. 응용 프로그램이 서버 클러스터에서 실행될 경우 하나의 잠재적 인 문제가 발생할 수 있습니다. 이 경우 두 개의 JVM에서이 코드가 동시에 실행되면 동일한 순서가 생성됩니다.

그렇지 않은 경우 날짜를 기준으로 한 고유 한 주문 번호 생성이 나에게 들립니다. 여기서 해시의 의미를 실제로 이해하지 못했습니다. 암호 관점에서 볼 때 실제로 코드에 보안을 추가하지는 않습니다. "악의적 인"클라이언트가 SHA1 해시가 적용되었음을 알 수있는 주문 번호를 추측하면 알고리즘 자체가 알려져 있으며 주문 번호를 결정하는 데 적용될 수 있습니다.

희망이

+1

맞습니다. 해시가 필요 없습니다. – jimgardener

+0

사용자가 수정 한 양식 (user1-gmail-com 등)을 생성 시간 문자열에 추가하면 앱이 클러스터에서 실행되는 경우 고유 한 주문 번호가 생성 될 수 있습니다. – jimgardener

+0

@jimgardener 가능성은 적지 만 불가능한 것은 아닙니다. 생성 시간에 밀리 초를 더할 수 있습니다. 그러나 ID가 고유한지 확인할 수있는 중앙 저장소 (예 : 데이터베이스)가 있어야합니다. 어쨌든 이드와 무슨 상관이 있을까요? 왜 고유해야합니까? –

관련 문제