| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
a980fe1e9e | 测试 | 7 months ago |
|
|
1a2855842e | 增加ace加解密写法 | 7 months ago |
|
|
1451ae0148 | 修改GetDomain | 1 year ago |
|
|
c824e5a723 | 增加MAP合并方法 | 1 year ago |
|
|
814bdf7d29 | 增加雪花算法实现方法 | 2 years ago |
| @ -0,0 +1,75 @@ | |||
| package helper | |||
| import ( | |||
| "bytes" | |||
| "crypto/aes" | |||
| "crypto/cipher" | |||
| "encoding/base64" | |||
| ) | |||
| // PKCS7Padding 对数据进行填充 | |||
| func PKCS7Padding(data []byte, blockSize int) []byte { | |||
| padding := blockSize - len(data)%blockSize | |||
| padtext := bytes.Repeat([]byte{byte(padding)}, padding) | |||
| return append(data, padtext...) | |||
| } | |||
| // PKCS7UnPadding 去除填充 | |||
| func PKCS7UnPadding(data []byte) []byte { | |||
| length := len(data) | |||
| unpadding := int(data[length-1]) | |||
| return data[:(length - unpadding)] | |||
| } | |||
| // EncryptAES 对数据进行 AES 加密 | |||
| func EncryptAES(str, key_str string) (string, error) { | |||
| plaintext := []byte(str) | |||
| key := []byte(key_str) | |||
| // 创建一个新的 AES 块 | |||
| block, err := aes.NewCipher(key) | |||
| if err != nil { | |||
| return "", err | |||
| } | |||
| // 块大小 | |||
| blockSize := block.BlockSize() | |||
| // 对明文进行填充 | |||
| plaintext = PKCS7Padding(plaintext, blockSize) | |||
| // 创建一个 CBC 模式的加密块 | |||
| ciphertext := make([]byte, len(plaintext)) | |||
| mode := cipher.NewCBCEncrypter(block, key[:blockSize]) | |||
| // 加密数据 | |||
| mode.CryptBlocks(ciphertext, plaintext) | |||
| // 将加密结果进行 Base64 编码 | |||
| return base64.StdEncoding.EncodeToString(ciphertext), nil | |||
| } | |||
| // DecryptAES 对数据进行 AES 解密 | |||
| func DecryptAES(ciphertext, key_str string) ([]byte, error) { | |||
| key := []byte(key_str) | |||
| // 对 Base64 编码的密文进行解码 | |||
| ciphertextBytes, err := base64.StdEncoding.DecodeString(ciphertext) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| // 创建一个新的 AES 块 | |||
| block, err := aes.NewCipher(key) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| // 块大小 | |||
| blockSize := block.BlockSize() | |||
| // 创建一个 CBC 模式的解密块 | |||
| mode := cipher.NewCBCDecrypter(block, key[:blockSize]) | |||
| // 解密数据 | |||
| plaintext := make([]byte, len(ciphertextBytes)) | |||
| mode.CryptBlocks(plaintext, ciphertextBytes) | |||
| // 去除填充 | |||
| plaintext = PKCS7UnPadding(plaintext) | |||
| return plaintext, nil | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| package helper | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_EncryptAES(t *testing.T) { | |||
| // 要加密的明文 | |||
| //str := `{"open_id":"op2kh5PTc2-4u3XaADjjbkxeXPn0","userName":"山野雾灯"}` | |||
| // 密钥,AES 支持 16、24 或 32 字节的密钥 | |||
| key := "0123456789shopef0123456789shopef" | |||
| /*ret, err := EncryptAES(str, key) | |||
| t.Log(err) | |||
| t.Log(ret)*/ | |||
| ret := "jpWI1PWjg9GKmSMRv8WiuL4CI/vZG3xgTfOiLrbY8ZK+T8poUgK7fFPkj7H2tGSHbB1A/ucOjjSwEvbQDYZfOw==" | |||
| res, err := DecryptAES(ret, key) | |||
| t.Log(err) | |||
| t.Log(string(res)) | |||
| } | |||
| @ -0,0 +1,62 @@ | |||
| package helper | |||
| import ( | |||
| "sync" | |||
| "time" | |||
| ) | |||
| // Snowflake 结构体 | |||
| type Snowflake struct { | |||
| mu sync.Mutex | |||
| startTime int64 // 起始时间戳,可以根据实际需求设置 | |||
| machineID int64 // 机器ID | |||
| sequenceNum int64 // 序列号 | |||
| } | |||
| // NewSnowflake 创建一个Snowflake实例 | |||
| func NewSnowflake(machineID int64) *Snowflake { | |||
| return &Snowflake{ | |||
| startTime: getTimeStamp(), | |||
| machineID: machineID, | |||
| sequenceNum: 0, | |||
| } | |||
| } | |||
| // Generate 生成一个唯一ID | |||
| func (s *Snowflake) Generate() int64 { | |||
| s.mu.Lock() | |||
| defer s.mu.Unlock() | |||
| currentTime := getTimeStamp() | |||
| // 如果当前时间小于上一次生成ID的时间,说明时钟回拨,需要等待 | |||
| if currentTime < s.startTime { | |||
| time.Sleep(time.Duration(s.startTime - currentTime)) | |||
| currentTime = getTimeStamp() | |||
| } | |||
| // 如果是同一毫秒内生成的ID,需要增加序列号 | |||
| if currentTime == s.startTime { | |||
| s.sequenceNum++ | |||
| } else { | |||
| s.sequenceNum = 0 | |||
| s.startTime = currentTime | |||
| } | |||
| // 如果序列号超过了12位的最大值,等待下一毫秒再生成ID | |||
| if s.sequenceNum >= 1<<12 { | |||
| time.Sleep(time.Millisecond) | |||
| s.startTime = getTimeStamp() | |||
| s.sequenceNum = 0 | |||
| } | |||
| // 生成ID | |||
| id := (currentTime-s.startTime)<<22 | (s.machineID << 12) | s.sequenceNum | |||
| return id | |||
| } | |||
| // 获取当前时间戳(毫秒级) | |||
| func getTimeStamp() int64 { | |||
| return time.Now().UnixNano() / int64(time.Millisecond) | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| package helper | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_snowflake(t *testing.T) { | |||
| // 创建一个Snowflake实例 | |||
| snowflake := NewSnowflake(169379266710) | |||
| // 生成10个唯一ID并输出 | |||
| for i := 0; i < 10; i++ { | |||
| id := snowflake.Generate() | |||
| t.Log(id) | |||
| } | |||
| } | |||
| @ -0,0 +1,12 @@ | |||
| package helper | |||
| import ( | |||
| "testing" | |||
| ) | |||
| func Test_GenerateUUID(t *testing.T) { | |||
| uuid, err := GenerateUUID() | |||
| t.Log(uuid) | |||
| t.Log(err) | |||
| } | |||