12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package lib
- import (
- "git.sfnt.net/sfnt/cnlink/conf"
- "math"
- "strings"
- )
- // Int2String converts an unsigned 64bit integer to a 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 % baseStringLength
- div := seq / baseStringLength
- charSeq = append(charSeq, rune(baseStringRune[mod]))
- seq = div
- }
- } else {
- charSeq = append(charSeq, rune(baseStringRune[seq]))
- }
- tmpShortURL := string(charSeq)
- shortURL = string(reverse(tmpShortURL))
- return
- }
- // String2Int converts a short URL string to an unsigned 64bit integer.
- 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 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 r
- }
|