|
@@ -1,45 +1,70 @@
|
|
|
package lib
|
|
|
|
|
|
import (
|
|
|
+ "git.sfnt.net/sfnt/cnlink/conf"
|
|
|
"math"
|
|
|
"strings"
|
|
|
-
|
|
|
- "git.sfnt.net/sfnt/cnlink/conf"
|
|
|
)
|
|
|
|
|
|
// Int2String converts an unsigned 64bit integer to a string.
|
|
|
-func Int2String(seq uint64) (shortURL string) {
|
|
|
+func Int2String(seq uint64, cn bool) (shortURL string) {
|
|
|
charSeq := []rune{}
|
|
|
+ baseStringRune := []rune(conf.Conf.Common.BaseString)
|
|
|
+ baseStringLength :=conf.Conf.Common.BaseStringLength
|
|
|
+ if cn == true {
|
|
|
+ baseStringRune = []rune(conf.Conf.Common.BaseStringCn)
|
|
|
+ baseStringLength =conf.Conf.Common.BaseStringCnLength
|
|
|
+ }
|
|
|
if seq != 0 {
|
|
|
for seq != 0 {
|
|
|
- mod := seq % conf.Conf.Common.BaseStringLength
|
|
|
- div := seq / conf.Conf.Common.BaseStringLength
|
|
|
- charSeq = append(charSeq, rune(conf.Conf.Common.BaseString[mod]))
|
|
|
+ mod := seq % baseStringLength
|
|
|
+ div := seq / baseStringLength
|
|
|
+ charSeq = append(charSeq, rune(baseStringRune[mod]))
|
|
|
seq = div
|
|
|
}
|
|
|
} else {
|
|
|
- charSeq = append(charSeq, rune(conf.Conf.Common.BaseString[seq]))
|
|
|
+ charSeq = append(charSeq, rune(baseStringRune[seq]))
|
|
|
}
|
|
|
|
|
|
tmpShortURL := string(charSeq)
|
|
|
- shortURL = reverse(tmpShortURL)
|
|
|
+ shortURL = string(reverse(tmpShortURL))
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// String2Int converts a short URL string to an unsigned 64bit integer.
|
|
|
-func String2Int(shortURL string) (seq uint64) {
|
|
|
- shortURL = reverse(shortURL)
|
|
|
- for index, char := range shortURL {
|
|
|
- base := uint64(math.Pow(float64(conf.Conf.Common.BaseStringLength), float64(index)))
|
|
|
- seq += uint64(strings.Index(conf.Conf.Common.BaseString, string(char))) * base
|
|
|
+func String2Int(shortURL string, cn bool) (seq uint64) {
|
|
|
+ shortURLRune := reverse(shortURL)
|
|
|
+ baseString :=conf.Conf.Common.BaseString
|
|
|
+ baseStringRune := []rune(baseString)
|
|
|
+ baseStringLength :=conf.Conf.Common.BaseStringLength
|
|
|
+ if cn == true {
|
|
|
+ baseString =conf.Conf.Common.BaseStringCn
|
|
|
+ baseStringRune = []rune(baseString)
|
|
|
+ baseStringLength =conf.Conf.Common.BaseStringCnLength
|
|
|
+ }
|
|
|
+ for index, char := range shortURLRune {
|
|
|
+ base := uint64(math.Pow(float64(baseStringLength), float64(index)))
|
|
|
+ if cn==true {
|
|
|
+ seq += uint64(getRuneIndex(baseStringRune, string(char))) * base
|
|
|
+ } else {
|
|
|
+ seq += uint64(strings.Index(baseString, string(char))) * base
|
|
|
+ }
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
-func reverse(s string) string {
|
|
|
+func getRuneIndex(r []rune, c string) (i int){
|
|
|
+ for index ,rc := range r {
|
|
|
+ if rc == ([]rune(c))[0] {
|
|
|
+ i = index
|
|
|
+ return i
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1
|
|
|
+}
|
|
|
+func reverse(s string) []rune {
|
|
|
r := []rune(s)
|
|
|
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
|
|
|
r[i], r[j] = r[j], r[i]
|
|
|
}
|
|
|
- return string(r)
|
|
|
+ return r
|
|
|
}
|