最近都在思考如何應用spark來應付未來公司方向的需求以及被空降的急案壓榨
,好久沒有發文刷存在感了!
今天手邊工作到一段落又湊巧看到fysh711426大大
發的使用 Token 進行 API 授權驗證
流程跟 『區塊鏈』 「分散式電子帳本」技術中帳本間的串接原理類似,所以來分享一下物件導向
hashcode的一些基本概念。
String s1 = "abc";
String s2 = "abc";
Integer a = 123;
Integer b = 123;
System.out.println(s1.equals(s2));
System.out.println(a.equals(b));
上面這段程式沒啥特別的地方結果當然都是輸出true
!
public class BlockChain {
Integer page;
Date date;
List<String> transations;
// BlockChain的建構子
public BlockChain(Integer page,
Date date,
List<String> transations) {
this.page = page;
this.date = date;
this.transations = transations;
}
}
那如果我們有一個 BlockChain 的物件,包含整數的page
、日期的date
、List的交易
三個屬性; 然後我們創建兩個物件b1跟b2且b1與b2的三個屬性值均相等
public static void main(String[] args) {
List<String> trans4Darwin = new ArrayList<String>();
trans4Darwin.add("Darwin2Joe");
Date now = new Date();
BlockChain b1 = new BlockChain(1, now, trans4Darwin);
BlockChain b2 = new BlockChain(1, now, trans4Darwin);
System.out.println(b1.equals(b2));
}
這時執行反而會印出false
。Why ? 如果認為是List.class跟Date.class造成的
可以只留page,但結果還是false
!
不賣關子公佈答案了:
其實原因出在當我們自建物件時,編譯器會很貼心的幫我們創建物件對應的hashcode
!
以 Java 為例
System.out.println(b1.hashcode());
System.out.println(b1);
會輸出1627674070
而在toString()後則會跑出com.company.BlockChain@610455d6
上面這串鬼東西就是依據編譯器幫我們建的hashcode產出的b1代表字串。
在物件導向中,hashcode就是一個物件的代表
。
所以如果我們有一個物件是老百姓
,那最簡單的hashcode就可設定為身分證字號
!
其實在SCJP Java 5.0專業認證手冊
(台中國資圖有2本可借)的第七章中,有強調『當你改寫hashcode()這個方法時,equals()這個方法也要一併改寫的鐵則。』
個人還滿私心推薦 Kathy Sierra 的程式相關書籍 XD !
講了這麼多,那這跟區塊鏈分散式電子帳本技術有啥關聯?
基本上區塊鏈分散式電子帳本最主要就是紀錄:公鏈hashcode
、時間戳
、交易明細(挖到的比特幣跟
買毒交易的比特幣)
而公鏈hashcode的產生過程不精確的簡單說
就是把fysh711426大大文章中的header、payload、signature
替換成帳本的每一頁。
而實際存在 nosql DB 或者 spark、hadoop等平台的就是這些加密後的公鏈hashcode !
而目前的瓶頸在於FILO堆疊檢索的極限以及配合獎勵機制及其他零零總總確保交易的
程式碼,是否因為不當的公鏈hashcode而系統崩潰!
總而言之言而總之,當你設計的區塊鏈加密貨幣可在其他國家發行時,
別忘了寫篇論文分享公鏈技術,賺了裡子也賺了面子 XD !
最後,誰說電腦沒極限,認為沒極限的可幫忙幫我把下面這個數字作因數分解,感謝!64397501735471938465017354627948578301837045820347501927402947850284756