golang104,golang116

本文目錄一覽:

各國程序員薪資水平,最高都知道、墊底想不到…

大家好,我是 微笑。

看到一份「 2022年各國程序員的平均薪資報告 」,給大家參考看看。

智能招聘平台 CodeSubmit 統計分析了 20 多個國家在 2022 年的軟件工程領域的平均工資發現,美國的軟件工程師薪資水平最高,瑞士和以色列緊隨其後。

前十榜單還包括丹麥、加拿大、挪威、澳大利亞、英國、德國和瑞典。中國則排在第 19 位,平均薪資水平為 23,790 美元 / 年。

其他方面,印度是一個西方公司傾向於將其技術需求外包的國家,其平均年薪為 7,725 美元。尼日利亞薪資水平墊底,為 7,255 美元 / 年。

CodeSubmit 方面指出,總體而言軟件開發是世界上最受歡迎的職業。對軟件開發人員需求最高的國家是加拿大、澳大利亞、俄羅斯、瑞典和新西蘭;由於人才緊缺,工資水平也往往更高。

美國軟件開發人員 的平均工資為每年 110,140 美元或每月 9,178 美元。初級開發人員的平均工資為每年 69,354 美元或每月 5,779 美元,高級開發人員的平均工資為每年 104,188 美元或每月 8,682 美元。

軟件開發人員收入最高的州是加利福尼亞,平均工資為 146,770 美元;華盛頓次之。收入最高的城市包括聖何塞(167,420 美元)、舊金山(158,320 美元)和西雅圖(148,200 美元)。

該國的編程語言平均薪資水平中,Go 和 Python 等流行的後端語言位居榜首。具體表現為:

歐洲軟件開發人員的平均工資水平低於美國。

總體而言,歐洲國家在東西方之間存在很大差異。 西歐開發者 的年收入至少為 40,000 美元以上,而 東歐的開發者 期望的收入要少得多,約為 20,000 美元以上; 南歐開發者 的薪酬也要低於北歐開發者。 西班牙、意大利、葡萄牙和希臘的開發人員 預計年薪範圍在 21,314 到 36,323 美元。

美國和歐洲國家之外, 以色列軟件開發人員 的平均年薪為 71,559 美元或每月 5,963 美元。初級開發人員每年賺 69,851 美元或每月 5,820 美元,高級開發人員通常年薪為 114,751 美元或每月 9,562 美元。

語言方面,Golang(每年 109,702 美元)和 Python(每年 83,369 美元)平均薪資水平最高。PHP 和 Ruby 在以色列支付的薪資水平最低,分別為每年 64,573 美元和 64,525 美元。

此外, 日本開發人員 的平均工資為每年 36,024 美元或每月 3,002 美元。編程語言薪資方面,iOS 水平最高,Ruby 位居第二;SQL 和 Java 是日本收入最低的編程語言。

印度軟件開發人員 的平均工資為每年 7,725 美元或每月 643 美元。Ruby 是印度收入最高的編程語言,每年 12,372 美元。Android 是薪資水平最低的語言,為 5,181 美元 / 年。

總體而言,各國總體編程語言薪資水平中,Golang 和 Ruby 往往是高薪語言,而 JavaScript 和 PHP 則是工資最低的語言。

文末有一個我們團隊正在測試的副業,已經操盤了快1年多,執行力夠強的小夥伴基本都能拿到結果。

感興趣的話,可以加下他的微信,領取一份副業筆記。

掃碼加我微信

憑文章截圖,領取價值999元的

《副業賺錢實戰筆記》

什麼是3DES對稱加密算法?

DES加密經過下面的步驟

1、提供明文和密鑰,將明文按照64bit分塊(對應8個字節),不足8個字節的可以進行填充(填充方式多種),密鑰必須為8個字節共64bit

填充方式:

當明文長度不為分組長度的整數倍時,需要在最後一個分組中填充一些數據使其湊滿一個分組長度。

* NoPadding

API或算法本身不對數據進行處理,加密數據由加密雙方約定填補算法。例如若對字符串數據進行加解密,可以補充\0或者空格,然後trim

* PKCS5Padding

加密前:數據字節長度對8取余,餘數為m,若m0,則補足8-m個字節,字節數值為8-m,即差幾個字節就補幾個字節,字節數值即為補充的字節數,若為0則補充8個字節的8

解密後:取最後一個字節,值為m,則從數據尾部刪除m個字節,剩餘數據即為加密前的原文。

例如:加密字符串為為AAA,則補位為AAA55555;加密字符串為BBBBBB,則補位為BBBBBB22;加密字符串為CCCCCCCC,則補位為CCCCCCCC88888888。

* PKCS7Padding

PKCS7Padding 的填充方式和PKCS5Padding 填充方式一樣。只是加密塊的字節數不同。PKCS5Padding明確定義了加密塊是8字節,PKCS7Padding加密快可以是1-255之間。

2、選擇加密模式

**ECB模式** 全稱Electronic Codebook模式,譯為電子密碼本模式

**CBC模式** 全稱Cipher Block Chaining模式,譯為密文分組鏈接模式

**CFB模式** 全稱Cipher FeedBack模式,譯為密文反饋模式

**OFB模式** 全稱Output Feedback模式,譯為輸出反饋模式。

**CTR模式** 全稱Counter模式,譯為計數器模式。

3、開始加密明文(內部原理–加密步驟,加密算法實現不做講解)

image

1、將分塊的64bit一組組加密,示列其中一組:將此組進行初始置換(IP置換),目的是將輸入的64位數據塊按位重新組合,並把輸出分為L0、R0兩部分,每部分各長32位。

2、開始Feistel結構的16次轉換,第一次轉換為:右側數據R0和子密鑰經過輪函數f生成用於加密左側數據的比特序列,與左側數據L0異或運算,

運算結果輸出為加密後的左側L0,右側數據則直接輸出為右側R0。由於一次Feistel輪並不會加密右側,因此需要將上一輪輸出後的左右兩側對調後才正式完成一次Feistel加密,

3、DES算法共計進行16次Feistel輪,最後一輪輸出後左右兩側無需對調,每次加密的子密鑰不相同,子密鑰是通過秘鑰計算得到的。

4、末置換是初始置換的逆過程,DES最後一輪後,左、右兩半部分並未進行交換,而是兩部分合併形成一個分組做為末置換的輸入

DES解密經過下面的步驟

1、拿到密文和加密的密鑰

2、解密:DES加密和解密的過程一致,均使用Feistel網絡實現,區別僅在於解密時,密文作為輸入,並逆序使用子密鑰。

3、講解密後的明文去填充 (padding)得到的即為明文

Golang實現DES加密解密

package main

import (

“fmt”

“crypto/des”

“bytes”

“crypto/cipher”

)

func main() {

var miwen,_= DESEncode([]byte(“hello world”),[]byte(“12345678”))

fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最後5位是補碼

var txt,_ = DESDecode(miwen,[]byte(“12345678”))

fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明碼

fmt.Printf(“%s”,txt) // hello world

}

// 加密函數

func DESEncode(orignData, key []byte)([]byte,error){

// 建立密碼塊

block ,err:=des.NewCipher(key)

if err!=nil{ return nil,err}

// 明文分組,不足的部分加padding

txt := PKCS5Padding(orignData,block.BlockSize())

// 設定加密模式,為了方便,初始向量直接使用key充當了(實際項目中,最好別這麼做)

blockMode := cipher.NewCBCEncrypter(block,key)

// 創建密文長度的切片,用來存放密文字節

crypted :=make([]byte,len(txt))

// 開始加密,將txt作為源,crypted作為目的切片輸入

blockMode.CryptBlocks(crypted,txt)

// 將加密後的切片返回

return crypted,nil

}

// 加密所需padding

func PKCS5Padding(ciphertext []byte,size int)[]byte{

padding := size – len(ciphertext)%size

padTex := bytes.Repeat([]byte{byte(padding)},padding)

return append(ciphertext,padTex…)

}

// 解密函數

func DESDecode(cripter, key []byte) ([]byte,error) {

// 建立密碼塊

block ,err:=des.NewCipher(key)

if err!=nil{ return nil,err}

// 設置解密模式,加密模式和解密模式要一樣

blockMode := cipher.NewCBCDecrypter(block,key)

// 設置切片長度,用來存放明文字節

originData := make([]byte,len(cripter))

// 使用解密模式解密,將解密後的明文字節放入originData 切片中

blockMode.CryptBlocks(originData,cripter)

// 去除加密的padding部分

strByt := UnPKCS5Padding(origenData)

return strByt,nil

}

// 解密所需要的Unpadding

func UnPKCS5Padding(origin []byte) []byte{

// 獲取最後一位轉為整型,然後根據這個整型截取掉整型數量的長度

// 若此數為5,則減掉轉換明文後的最後5位,即為我們輸入的明文

var last = int(origin[len(origin)-1])

return origin[:len(origin)-last]

}

注意:在設置加密模式為CBC的時候,我們需要設置一個初始化向量,這個量的意思 在對稱加密算法中,如果只有一個密鑰來加密數據的話,明文中的相同文字就會也會被加密成相同的密文,這樣密文和明文就有完全相同的結構,容易破解,如果給一個初始化向量,第一個明文使用初始化向量混合併加密,第二個明文用第一個明文的加密後的密文與第二個明文混合加密,這樣加密出來的密文的結構則完全與明文不同,更加安全可靠。CBC模式圖如下

CBC

3DES

DES 的常見變體是三重 DES,使用 168 位的密鑰對資料進行三次加密的一種機制;它通常(但非始終)提供極其強大的安全性。如果三個 56 位的子元素都相同,則三重 DES 向後兼容 DES。

對比DES,發現只是換了NewTripleDESCipher。不過,需要注意的是,密鑰長度必須24byte,否則直接返回錯誤。關於這一點,PHP中卻不是這樣的,只要是8byte以上就行;而Java中,要求必須是24byte以上,內部會取前24byte(相當於就是24byte)。另外,初始化向量長度是8byte(目前各個語言都是如此,不是8byte會有問題)

protobuf3基礎語法

ProtoBuf (Google Protocol Buffer)是由google公司用於數據交換的序列結構化數據格式,具有跨平台、跨語言、可擴展特性,同類型有常用的XML及JSON,但具有更小的傳輸體積、更高的編碼、解碼能力,特別適合於數據存儲、網絡數據傳輸等對存儲體積、實時性要求高的領域,目前已經發展到protoc3 版本。

優點:空間效率高,時間效率要高,對於數據大小敏感,傳輸效率高的

缺點:消息結構可讀性不高,序列化後的字節序列為二進制序列不能簡單的分析有效性

備註:最後的時間類型golang需要引入包 github.com/golang/protobuf/ptypes/timestamp ,定義如下

然後 .protp 文件需要導入 google/protobuf/timestamp.proto

如果一個字段被 repeated 修飾,則表示它是一個列表類型的字段,相當於 golang 里的切片

如果你希望可以預留一些數字標籤或者字段可以使用reserved修飾符

第一個枚舉值的數值必須是0且至少有一個枚舉值,一個數值可以對應多個枚舉值,必須標明 option allow_alias = true; 不推薦使用負數值

在你的 .proto 文件中指定 service ,然後在 service 里定義 rpc方法 即可,要注意指定參數和返回值

gRPC 允許你定義4種類型的 service 方法

客戶端使用存根發送請求到服務器並等待響應返回,就像平常的函數調用一樣

通過在 響應返回參數 類型前插入 stream 關鍵字,可以指定一個服務器端的流方法。客戶端發送請求到服務器,拿到一個流去讀取返回的消息序列。 客戶端讀取返回的流,直到裡面沒有任何消息。

通過在 請求參數 類型前指定 stream 關鍵字來指定一個客戶端的流方法。客戶端寫入一個消息序列並將其發送到服務器,同樣也是使用流。一旦客戶端完成寫入消息,它等待服務器完成讀取返回它的響應。

通過在請求和響應前加 stream 關鍵字去制定方法的類型。兩個流獨立操作,因此客戶端和服務器可以以任意喜歡的順序讀寫:比如, 服務器可以在寫入響應前等待接收所有的客戶端消息,或者可以交替的讀取和寫入消息,或者其他讀寫的組合。

原創文章,作者:SYHE,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/140335.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SYHE的頭像SYHE
上一篇 2024-10-04 00:23
下一篇 2024-10-04 00:23

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 英語年齡用連字符號(Hyphenation for English Age)

    英語年齡通常使用連字符號表示,比如 “five-year-old boy”。本文將從多個方面探討英語年齡的連字符使用問題。 一、英語年齡的表達方式 英語中表…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Idea新建文件夾沒有java class的解決方法

    如果你在Idea中新建了一個文件夾,卻沒有Java Class,應該如何解決呢?下面從多個方面來進行解答。 一、檢查Idea設置 首先,我們應該檢查Idea的設置是否正確。打開Id…

    編程 2025-04-29
  • at least one option must be selected

    問題解答:當我們需要用戶在一系列選項中選擇至少一項時,我們需要對用戶進行限制,即“at least one option must be selected”(至少選擇一項)。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論