您的位置:

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 关键字去制定方法的类型。两个流独立操作,因此客户端和服务器可以以任意喜欢的顺序读写:比如, 服务器可以在写入响应前等待接收所有的客户端消息,或者可以交替的读取和写入消息,或者其他读写的组合。