1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-18 00:22:41 +08:00
This commit is contained in:
2022-05-06 17:29:35 +08:00
parent 25af24d7c0
commit cd0740f443
12 changed files with 102 additions and 6 deletions

1
collections/node.go Normal file
View File

@ -0,0 +1 @@
package collections

View File

@ -54,6 +54,24 @@ func NewRsa(h Hash, opts ...rsaOption) (*rsaInstance, error) {
return o, nil return o, nil
} }
func ParsePKCS8PrivateKey(p []byte) rsaOption {
return func(o *rsaInstance) error {
block, _ := pem.Decode(p)
if block == nil {
return errors.New("failed to decode private key")
}
prk, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return err
}
o.prk = prk.(*rsa.PrivateKey)
return nil
}
}
func ParsePKCS1PrivateKey(p []byte) rsaOption { func ParsePKCS1PrivateKey(p []byte) rsaOption {
return func(o *rsaInstance) error { return func(o *rsaInstance) error {
block, _ := pem.Decode(p) block, _ := pem.Decode(p)

View File

@ -3,7 +3,6 @@ package crypto
import ( import (
"crypto/rand" "crypto/rand"
"errors" "errors"
"fmt"
s "github.com/tjfoc/gmsm/sm2" s "github.com/tjfoc/gmsm/sm2"
x "github.com/tjfoc/gmsm/x509" x "github.com/tjfoc/gmsm/x509"
@ -54,8 +53,6 @@ func NewSm2(opts ...option) (*sm2Instance, error) {
func ParseSm2PrivateKey(p []byte, pwd []byte) option { func ParseSm2PrivateKey(p []byte, pwd []byte) option {
return func(so *sm2Instance) error { return func(so *sm2Instance) error {
fmt.Println(string(p))
priv, err := x.ReadPrivateKeyFromPem(p, pwd) priv, err := x.ReadPrivateKeyFromPem(p, pwd)
if err != nil { if err != nil {
return err return err

View File

@ -7,8 +7,19 @@ import (
"testing" "testing"
"github.com/charlienet/go-mixed/hash" "github.com/charlienet/go-mixed/hash"
"github.com/charlienet/go-mixed/rand"
"github.com/stretchr/testify/assert"
) )
func TestHashComplie(t *testing.T) {
abc, err := hash.New("MD5")
if err != nil {
}
b, _ := hex.DecodeString(rand.Hex.Generate(16))
assert.False(t, abc.Verify([]byte("source"), b))
}
func TestEncode(t *testing.T) { func TestEncode(t *testing.T) {
t.Log(hash.Sha1([]byte{0x31}).Base64()) t.Log(hash.Sha1([]byte{0x31}).Base64())
t.Log(hash.Sha1([]byte{0x31}).Hex()) t.Log(hash.Sha1([]byte{0x31}).Hex())

View File

@ -49,6 +49,17 @@ func (m *ConcurrnetMap[K, V]) Exist(key K) bool {
return mm.Exist(key) return mm.Exist(key)
} }
func (m *ConcurrnetMap[K, V]) Iter() <-chan *Entry[K, V] {
num := int(m.numOfBuckets)
ch := make(chan *Entry[K, V], m.Count())
for i := 0; i < num; i++ {
c := m.buckets[i].Iter()
ch <- <-c
}
return ch
}
func (m *ConcurrnetMap[K, V]) ForEach(f func(K, V)) { func (m *ConcurrnetMap[K, V]) ForEach(f func(K, V)) {
var wg sync.WaitGroup var wg sync.WaitGroup

View File

@ -34,6 +34,22 @@ func (m *hashMap[K, V]) Exist(key K) bool {
return ok return ok
} }
func (m *hashMap[K, V]) Iter() <-chan *Entry[K, V] {
ch := make(chan *Entry[K, V], m.Count())
go func() {
for k, v := range m.m {
ch <- &Entry[K, V]{
Key: k,
Value: v,
}
}
close(ch)
}()
return ch
}
func (m *hashMap[K, V]) ForEach(f func(K, V)) { func (m *hashMap[K, V]) ForEach(f func(K, V)) {
for k, v := range m.m { for k, v := range m.m {
f(k, v) f(k, v)

View File

@ -10,5 +10,11 @@ type Map[K constraints.Ordered, V any] interface {
Clone() Map[K, V] Clone() Map[K, V]
Clear() Clear()
Count() int Count() int
Iter() <-chan *Entry[K, V]
ForEach(f func(K, V)) ForEach(f func(K, V))
} }
type Entry[K constraints.Ordered, V any] struct {
Key K
Value V
}

View File

@ -49,6 +49,13 @@ func (m *rw_map[K, V]) Count() int {
return m.m.Count() return m.m.Count()
} }
func (m *rw_map[K, V]) Iter() <-chan *Entry[K, V] {
m.mu.RLock()
defer m.mu.RUnlock()
return m.m.Iter()
}
func (m *rw_map[K, V]) ForEach(f func(K, V)) { func (m *rw_map[K, V]) ForEach(f func(K, V)) {
m.mu.RLock() m.mu.RLock()
defer m.mu.RUnlock() defer m.mu.RUnlock()

View File

@ -64,6 +64,23 @@ func (m *sorted_map[K, V]) Clone() Map[K, V] {
return &sorted_map[K, V]{maps: m.maps.Clone(), keys: getKeys(m.maps)} return &sorted_map[K, V]{maps: m.maps.Clone(), keys: getKeys(m.maps)}
} }
func (m *sorted_map[K, V]) Iter() <-chan *Entry[K, V] {
c := make(chan *Entry[K, V], m.Count())
go func() {
for _, k := range m.keys {
v, _ := m.maps.Get(k)
c <- &Entry[K, V]{
Key: k,
Value: v,
}
}
close(c)
}()
return c
}
func (m *sorted_map[K, V]) ForEach(f func(K, V)) { func (m *sorted_map[K, V]) ForEach(f func(K, V)) {
m.maps.ForEach(f) m.maps.ForEach(f)
} }

View File

@ -25,7 +25,7 @@ func (s hash_set[T]) Contain(value T) bool {
func (s hash_set[T]) Clone() hash_set[T] { func (s hash_set[T]) Clone() hash_set[T] {
set := NewHashSet[T]() set := NewHashSet[T]()
set.Add(s.Values()...) set.Add(s.ToSlice()...)
return set return set
} }
@ -38,7 +38,7 @@ func (s hash_set[T]) Iterate(fn func(value T)) {
// Union creates a new set contain all element of set s and other // Union creates a new set contain all element of set s and other
func (s hash_set[T]) Union(other hash_set[T]) hash_set[T] { func (s hash_set[T]) Union(other hash_set[T]) hash_set[T] {
set := s.Clone() set := s.Clone()
set.Add(other.Values()...) set.Add(other.ToSlice()...)
return set return set
} }
@ -54,7 +54,7 @@ func (s hash_set[T]) Intersection(other hash_set[T]) hash_set[T] {
return set return set
} }
func (s hash_set[T]) Values() []T { func (s hash_set[T]) ToSlice() []T {
values := make([]T, 0, s.Size()) values := make([]T, 0, s.Size())
s.Iterate(func(value T) { s.Iterate(func(value T) {
values = append(values, value) values = append(values, value)

View File

@ -1,4 +1,8 @@
package sets package sets
type Set[T comparable] interface { type Set[T comparable] interface {
Add(values ...T)
Remove(v T)
Contain(value T) bool
IsEmpty() bool
} }

View File

@ -5,4 +5,12 @@ type sorted_set[T comparable] struct {
set Set[T] set Set[T]
} }
func NewSortedSet[T comparable]() *sorted_set[T] {
return &sorted_set[T]{
set: NewHashSet[T](),
}
}
func (s *sorted_set[T]) ToSlice() []T {
return s.sorted
}