tools.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package lib
  2. import (
  3. "git.sfnt.net/sfnt/cnlink/conf"
  4. "math"
  5. "strings"
  6. )
  7. // Int2String converts an unsigned 64bit integer to a string.
  8. func Int2String(seq uint64, cn bool) (shortURL string) {
  9. charSeq := []rune{}
  10. baseStringRune := []rune(conf.Conf.Common.BaseString)
  11. baseStringLength :=conf.Conf.Common.BaseStringLength
  12. if cn == true {
  13. baseStringRune = []rune(conf.Conf.Common.BaseStringCn)
  14. baseStringLength =conf.Conf.Common.BaseStringCnLength
  15. }
  16. if seq != 0 {
  17. for seq != 0 {
  18. mod := seq % baseStringLength
  19. div := seq / baseStringLength
  20. charSeq = append(charSeq, rune(baseStringRune[mod]))
  21. seq = div
  22. }
  23. } else {
  24. charSeq = append(charSeq, rune(baseStringRune[seq]))
  25. }
  26. tmpShortURL := string(charSeq)
  27. shortURL = string(reverse(tmpShortURL))
  28. return
  29. }
  30. // String2Int converts a short URL string to an unsigned 64bit integer.
  31. func String2Int(shortURL string, cn bool) (seq uint64) {
  32. shortURLRune := reverse(shortURL)
  33. baseString :=conf.Conf.Common.BaseString
  34. baseStringRune := []rune(baseString)
  35. baseStringLength :=conf.Conf.Common.BaseStringLength
  36. if cn == true {
  37. baseString =conf.Conf.Common.BaseStringCn
  38. baseStringRune = []rune(baseString)
  39. baseStringLength =conf.Conf.Common.BaseStringCnLength
  40. }
  41. for index, char := range shortURLRune {
  42. base := uint64(math.Pow(float64(baseStringLength), float64(index)))
  43. if cn==true {
  44. seq += uint64(getRuneIndex(baseStringRune, string(char))) * base
  45. } else {
  46. seq += uint64(strings.Index(baseString, string(char))) * base
  47. }
  48. }
  49. return
  50. }
  51. func getRuneIndex(r []rune, c string) (i int){
  52. for index ,rc := range r {
  53. if rc == ([]rune(c))[0] {
  54. i = index
  55. return i
  56. }
  57. }
  58. return -1
  59. }
  60. func reverse(s string) []rune {
  61. r := []rune(s)
  62. for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
  63. r[i], r[j] = r[j], r[i]
  64. }
  65. return r
  66. }