顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

2008年11月7日 星期五

為何不要用複合主鍵來設計資料庫?

現在終於知道為何不要使用複合主鍵了 。
這是為了將資料結構層與業務邏輯層切割 ,
令業務邏輯的異動影響底層資料結構的程度降到最低 。
除非是legacy(遺留系統)的情況 。
由於沒有多餘心力再去變更它,所以只能順著原設計來應用。

2008年10月20日 星期一

[教學網站]DIY部落

程式教學網站:

http://www.diybl.com

2008年10月9日 星期四

[備忘記]Java 如何製作亂數產生的密碼

public String makePassword(int passwordLength){
 //密碼的字符表(可以亂排,至於要不要有特殊字元就看後續的處理可否允許特殊字元的輸入)
 char[] word =
  {'a','b','c','d','e','f',
  'g','h','i','j','k','L',
  'm','0','n','o','1','2',
  '3','p','4','q','5','r',
  's','6','t','7','u','v',
  '8','w','x','9','y','z'};
 byte[] randomNumber = new byte[passwordLength];
 new Random().nextBytes(randomNumber);
 StringBuilder password = new StringBuilder();
 for(int i = 0; i < randomNumber.length; i++){
  password.append(word[Math.abs(randomNumber[i]) % word.length]);
 }
 return password.toString();
}

2008年9月24日 星期三

[備忘記]如何做密碼編碼?

方法1(使用 seam api):
import org.jboss.seam.security.digest.DigestUtils;

public String hash(String password){
 return new DigestUtils().md5Hex(password.getBytes("Big5"));
}


方法2(使用 Apache Jakarta 專案的 Commons codec):
import org.apache.commons.codec.digest.DigestUtils;

public String hash(String password){
 //1.3版的只有提供 MD5、SHA 的編碼,如果想要完整的 SHA 編碼,請下載 1.4-snapshot
 return new DigestUtils().md5Hex(password.getBytes("Big5"));
}

方法3(使用 java api + seam api):
import java.security.MessageDigest;
import org.jboss.seam.util.Hex;

public String hash(String password){
 try{
  //MessageDigest 可傳入的演算法參數有 MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512
  MessageDigest md = MessageDigest.getInstance("MD5");
  //字串轉 byte 可指定不同的 charsetName,但其中的差異要傳入的 password 非單純的英數字組合才看的出來
  md.update(password.getBytes("Big5"));
  return new String(Hex.encodeHex(md.digest()));
 }catch(Exception e){
  throw new RuntimeException(e.getMessage());
 }
}

2008年9月23日 星期二

[備忘記]Java內如何做四捨五入?

double number = 123.456123;
new BigDecimal(number, new MathContext(2, RoundingMode.HALF_UP)).doubleValue();
結果:120.0

new BigDecimal(number, new MathContext(5, RoundingMode.HALF_UP)).doubleValue();
結果:123.46

這是因為粗體字的設定代表返回數字的精度位數,由準確返回值的最左端數字開始計算。

所以要動態的取得整數位數要另外設計:
public int getIntegerLength(double number){
String[] s = new Double(number).toString().split("\\.");
return s[0].equals("0") ? 0 : s[0].length();
}

new BigDecimal(number, new MathContext(getIntegerLength(number) + 2, RoundingMode.HALF_UP)).doubleValue();

如此粗體字部分就可以自行設定要取得小數點後幾位的四捨五入了。