|
- /*
- https://github.com/fs111/kurz.go/blob/master/src/codec.go
-
- Originally written and Copyright (c) 2011 André Kelpe
- Modifications Copyright (c) 2015 John Ko
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- the Software, and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
- package server
-
- import (
- "math"
- "strings"
- )
-
- const (
- // characters used for short-urls
- SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-
- // someone set us up the bomb !!
- BASE = int64(len(SYMBOLS))
- )
-
- // encodes a number into our *base* representation
- // TODO can this be made better with some bitshifting?
- func Encode(number int64) string {
- rest := number % BASE
- // strings are a bit weird in go...
- result := string(SYMBOLS[rest])
- if number-rest != 0 {
- newnumber := (number - rest) / BASE
- result = Encode(newnumber) + result
- }
- return result
- }
-
- // Decodes a string given in our encoding and returns the decimal
- // integer.
- func Decode(input string) int64 {
- const floatbase = float64(BASE)
- l := len(input)
- var sum int = 0
- for index := l - 1; index > -1; index -= 1 {
- current := string(input[index])
- pos := strings.Index(SYMBOLS, current)
- sum = sum + (pos * int(math.Pow(floatbase, float64((l-index-1)))))
- }
- return int64(sum)
- }
|