From 87c08d0d7af4c6ce8e6d85bbb5dc1d4d62115e9a Mon Sep 17 00:00:00 2001 From: Fangliding Date: Sat, 6 Jun 2026 06:11:54 +0800 Subject: [PATCH] More table --- infra/conf/transport_internet.go | 20 ++++++++++++++++++++ transport/internet/splithttp/config.go | 25 +++++++++++++------------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index edd158e15..255102650 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -6,6 +6,7 @@ import ( "encoding/hex" "encoding/json" "math" + "math/big" "net/netip" "net/url" "os" @@ -381,6 +382,14 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { } if c.SessionIDTable != "" { + if predefined, ok := splithttp.PredefinedTable[c.SessionIDTable]; ok { + c.SessionIDTable = predefined + } + room := roomSize(len(c.SessionIDTable), c.SessionIDLength.From, c.SessionIDLength.To) + // 2.1B possiblities should be enough + if room.Cmp(big.NewInt(2<<30)) < 0 { + return nil, errors.New("sessionIDTable or sessionIDLength is too small") + } if c.SessionIDLength.From <= 0 { return nil, errors.New("sessionIDLength.from must be greater than 0") } @@ -454,6 +463,17 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { return config, nil } +func roomSize(tableSize int, min, max int32) *big.Int { + base := big.NewInt(int64(tableSize)) + sum := new(big.Int) + term := new(big.Int) + for k := min; k <= max; k++ { + term.Exp(base, big.NewInt(int64(k)), nil) + sum.Add(sum, term) + } + return sum +} + const ( Byte = 1 Kilobyte = 1024 * Byte diff --git a/transport/internet/splithttp/config.go b/transport/internet/splithttp/config.go index 16b4d47f1..5873af628 100644 --- a/transport/internet/splithttp/config.go +++ b/transport/internet/splithttp/config.go @@ -488,22 +488,23 @@ func (c *RangeConfig) rand() int32 { } // predefined -var ( - base62Table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - hexTable = "0123456789abcdef" - hexTableUpper = "0123456789ABCDEF" -) +var PredefinedTable = map[string]string{ + "number": "0123456789", + "base62": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + "base36": "0123456789abcdefghijklmnopqrstuvwxyz", + "BASE36": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "hex": "0123456789abcdef", + "HEX": "0123456789ABCDEF", + "Alphabet": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + "ALPHABET": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "alphabet": "abcdefghijklmnopqrstuvwxyz", +} func (c *Config) GenerateSessionID() string { length := c.SessionIDLength.rand() table := c.SessionIDTable - switch table { - case "base62": - table = base62Table - case "hex": - table = hexTable - case "HEX": - table = hexTableUpper + if predefined, ok := PredefinedTable[table]; ok { + table = predefined } if table != "" && length > 0 { id := make([]byte, length)