a simple url shortener in Go (check it out at qurl.org)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
943 B

6 years ago
  1. package qurl
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. )
  7. type QURL struct {
  8. ID uint64
  9. URL string
  10. Created time.Time
  11. IP []byte
  12. Browser string
  13. }
  14. const alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  15. const alphalen = uint64(len(alpha))
  16. func ToString(v uint64) string {
  17. var r strings.Builder
  18. var i uint64
  19. for i = v; i >= alphalen; i = (i / alphalen) - 1 {
  20. r.WriteByte(alpha[i%alphalen])
  21. }
  22. r.WriteByte(alpha[i])
  23. return r.String()
  24. }
  25. func FromString(s string) (uint64, error) {
  26. var r uint64
  27. vlen := uint64(len(s))
  28. for i := uint64(0); i < vlen; i++ {
  29. x := strings.IndexByte(alpha, s[i])
  30. if x == -1 {
  31. return 0, fmt.Errorf("Invalid character [%s]", s[i])
  32. }
  33. if i == 0 {
  34. r += uint64(x)
  35. } else {
  36. r += (uint64(x+1) * pow(alphalen, i))
  37. }
  38. }
  39. return r, nil
  40. }
  41. func pow(a, b uint64) uint64 {
  42. p := uint64(1)
  43. for b > 0 {
  44. if b&1 != 0 {
  45. p *= a
  46. }
  47. b >>= 1
  48. a *= a
  49. }
  50. return p
  51. }