小技巧 && 算法 淺談

位運算

位運算符的分類及其定義
  • 與運算符&: 既二進制情況下,2者都爲1才都爲1 1101 & 0011=0001(按位與)
  • 或運算符|: 既二進制情況下,2者有一個爲1就是1 如 1011| 0010=1011 (按位或)
  • 異或運算符^: 既二進制個情況下,相同則爲0,否則爲1,如1111 ^ 0010=1101 (按位異或)
  • 作用:
    • 因爲計算機都是二進制數據,而通常位運算會被正常的邏輯運算符快,因而性能上會有少許的提升(如&代替%)

    • 並且可以減少內存,完全可以用位置上的值代替某種狀態

    • 使用場景:

      • 非常適合於累加狀態的判斷,添加,刪除,修改都非常方便,也就是說非常適合於權限等功能

          • 如 有狀態 add=1 delete=2 update=4
          • 則完全可以通過位運算來實現功能的累加
      • 添加: 通過 | 運算符 : a=0 a | b 則b 的可能即可被添加到a上 ,0 | 1=0001 添加了add

      • 刪除: 通過異或運算符 ^: a ^ b 則會在a中刪除b的功能 0111 ^ 0010 = 0101 刪除了delete

      • 判斷: 通過&運算符: a & b 即可判斷是否存在功能b 0111 & 0100 =0100 >0 判斷delete功能是否存在
        # 位運算

  • 可以通過 位運算達到簡化多重if else

    • // @我的  0000 0001  1
      	MSG_CATEGORY_AT = 1
      	// 私信   0000 0010 2
      	MSG_CATEGORY_PRV = MSG_CATEGORY_AT << 1
      	// 贊    0000 0100 4
      	MSG_CATEGORY_APPROVE = MSG_CATEGORY_PRV << 1
      	// 回覆   0001 0000 8
      	MSG_CATEGORY_REPLAY = MSG_CATEGORY_APPROVE << 1
      	// 系統通知 0010 0000 16
      	MSG_CATEGORY_SYSTEM_NOTIFY = MSG_CATEGORY_REPLAY << 1
      	// 最大值
      	MSG_CATEGORY_MAX = MSG_CATEGORY_AT | MSG_CATEGORY_PRV | MSG_CATEGORY_APPROVE | MSG_CATEGORY_REPLAY | MSG_CATEGORY_SYSTEM_NOTIFY
      
    • for i:=8;i>0;i>>=1{
      	if i&k>=k{
      		params=append(params,i)
      	}
      }
      這樣就可以直接sql 中來個in查詢啦
      
  • 範圍類型的定義可以由小到達的順序:

    • // 範圍最小的type 點對點
        	MSG_TYPE_BETWEEN_USER=1
        
        	// 000000000 00000000 00000000 10000001  & 這個表明發送的都是羣組信息
        	MSG_TYPE_BASE_GROUP = MSG_TYPE_BETWEEN_USER << 7|MSG_TYPE_BETWEEN_USER
        	// 羣組發送 000000000 00000000 11000000 00000001
        	MSG_TYPE_PLAT_USER_GROUP = MSG_TYPE_BASE_GROUP | MSG_TYPE_BASE_GROUP<<1
       	 // 全站 用戶 00000000 00000000 10000000 00000001
        	MSG_TYPE_BASE_FULL_SITE= MSG_TYPE_BETWEEN_USER<<15 | MSG_TYPE_BETWEEN_USER
        	// 平臺公告 00000000 00000001 10000000 00000001
        	MSG_TYPE_PLAT_ANNOUNCEMENT = MSG_TYPE_BASE_FULL_SITE | MSG_TYPE_BASE_FULL_SITE<<1
        	// 活動通知 00000000 00000010 10000000 00000001
        	MSG_TYPE_PLAT_EVENT_NOTICE = MSG_TYPE_BASE_FULL_SITE | MSG_TYPE_BASE_FULL_SITE<<2
      
    • 再在判斷中以由大到小的順序判斷:

    if req.MessageType&constants.MSG_TYPE_BASE_FULL_SITE >= constants.MSG_TYPE_BASE_FULL_SITE {
      
    }else if req.MessageType&constants.MSG_TYPE_BASE_GROUP >= constants.MSG_TYPE_BASE_GROUP{
    
    }else if if req.MessageType&constants.MSG_TYPE_BETWEEN_USER>=constants.MSG_TYPE_BETWEEN_USER{
    
    }else{
    
    }
    
    • 並且,在參數校驗中,只需要判斷是否滿足最小的即可

      if r.MessageType&constants.MSG_TYPE_BETWEEN_USER < constants.MSG_TYPE_BETWEEN_USER {
        return errors.New("")
      }
      

算法

HD錢包(Hierarchical Deterministic)

  • HD錢包的全稱是:分層確定性錢包
  • 在區塊鏈中可用於管理錢包
  • 錢包生成流程:
    • 1 .生成由12個單詞組成的助記詞;
    • 2 .通過該助記詞生成一串私鑰,這串私鑰稱爲主私鑰或根私鑰;
    • 3 . 通過主私鑰/根私鑰,生成N對子私鑰和子公鑰;
    • 4 . 由這些子公鑰生成對應的錢包地址。
  • 總結: 只需要備份一串主私鑰,由主私鑰推斷出海量的子公私鑰
  • 實際應用:
    • 對於企業級分層應用: 如交易平臺,交易平臺保管其主公私鑰
      • 領導保管一串主公私鑰,生成一堆子私鑰,旗下部門保存各自的私鑰,這樣 領導可以管理部門,部門又有其隱私
    • 對於個人而言:
      • 個人保存其主公私鑰,每次收款的時候都使用新的地址來收款
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章