Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'web/global')
-rw-r--r--web/global/hashStorage.go91
1 files changed, 91 insertions, 0 deletions
diff --git a/web/global/hashStorage.go b/web/global/hashStorage.go
new file mode 100644
index 00000000..099a54ed
--- /dev/null
+++ b/web/global/hashStorage.go
@@ -0,0 +1,91 @@
+package global
+
+import (
+ "crypto/md5"
+ "encoding/hex"
+ "sync"
+ "time"
+)
+
+type HashEntry struct {
+ Hash string
+ Value string
+ Timestamp time.Time
+}
+
+type HashStorage struct {
+ sync.RWMutex
+ Data map[string]HashEntry
+ Expiration time.Duration
+ ForceSave bool
+}
+
+func NewHashStorage(expiration time.Duration, forceSave bool) *HashStorage {
+ return &HashStorage{
+ Data: make(map[string]HashEntry),
+ Expiration: expiration,
+ ForceSave: forceSave,
+ }
+}
+
+func (h *HashStorage) AddHash(query string) string {
+ if h.ForceSave {
+ return h.saveValue(query)
+ }
+
+ // we only need to hash for more than 64 chars by default
+ if len(query) <= 64 {
+ return query
+ }
+
+ return h.saveValue(query)
+}
+
+func (h *HashStorage) saveValue(query string) string {
+ h.Lock()
+ defer h.Unlock()
+
+ md5Hash := md5.Sum([]byte(query))
+ md5HashString := hex.EncodeToString(md5Hash[:])
+
+ entry := HashEntry{
+ Hash: md5HashString,
+ Value: query,
+ Timestamp: time.Now(),
+ }
+
+ h.Data[md5HashString] = entry
+
+ return md5HashString
+}
+
+func (h *HashStorage) GetValue(hash string) string {
+ h.RLock()
+ defer h.RUnlock()
+
+ entry, exists := h.Data[hash]
+ if !exists {
+ return hash
+ }
+ return entry.Value
+}
+
+func (h *HashStorage) RemoveExpiredHashes() {
+ h.Lock()
+ defer h.Unlock()
+
+ now := time.Now()
+
+ for hash, entry := range h.Data {
+ if now.Sub(entry.Timestamp) > h.Expiration {
+ delete(h.Data, hash)
+ }
+ }
+}
+
+func (h *HashStorage) Reset() {
+ h.Lock()
+ defer h.Unlock()
+
+ h.Data = make(map[string]HashEntry)
+}