Author | SHA1 | Message | Date |
---|---|---|---|
|
a980fe1e9e | 测试 | 4 months ago |
|
1a2855842e | 增加ace加解密写法 | 4 months ago |
|
1451ae0148 | 修改GetDomain | 1 year ago |
|
c824e5a723 | 增加MAP合并方法 | 1 year ago |
|
814bdf7d29 | 增加雪花算法实现方法 | 1 year 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) | |||
} |