2011-09-24 74 views
0

在我java程序,我需要生成一個unique order numbercustomer's order。我認爲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

如果您的應用程序在服務器羣集上運行,則會出現一個潛在的問題cn。 在這種情況下,如果碰巧在兩個JVM中同時執行此代碼,將生成相同的訂單。

如果不是這種情況,基於日期的唯一訂單號的生成對我來說聽起來還不錯。 這裏我沒有真正理解哈希的含義。 我的意思是從密碼學的角度來看,它並不真正爲您的代碼添加安全性。如果一個「惡意」的客戶端猜測了訂單號,那麼它足以知道應用了SHA1哈希,算法本身是已知的,並且可以用於確定訂單號。

希望這會有幫助

+1

正確..散列是不必要的我猜 – jimgardener

+0

如果應用程序運行在羣集 – jimgardener

+0

@jimgardener這將使用戶emailaddress(如user1-gmail-com)的修改後的表單添加到創建時間字符串可能會創建一個唯一的訂單號,這使得它不太可能,但並非不可能。您可以將毫秒添加到創建時間。但是應該有一箇中央存儲(例如數據庫),您可以檢查該ID是否是唯一的。即,你打算如何處理id?爲什麼它需要是獨一無二的? –