Initial commit
This commit is contained in:
59
qurl/qurl.go
Normal file
59
qurl/qurl.go
Normal file
@ -0,0 +1,59 @@
|
||||
package qurl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type QURL struct {
|
||||
ID uint64
|
||||
URL string
|
||||
Created time.Time
|
||||
IP []byte
|
||||
Browser string
|
||||
}
|
||||
|
||||
const alpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
||||
const alphalen = uint64(len(alpha))
|
||||
|
||||
func ToString(v uint64) string {
|
||||
var r strings.Builder
|
||||
var i uint64
|
||||
for i = v; i >= alphalen; i = (i / alphalen) - 1 {
|
||||
r.WriteByte(alpha[i%alphalen])
|
||||
}
|
||||
r.WriteByte(alpha[i])
|
||||
return r.String()
|
||||
}
|
||||
|
||||
func FromString(s string) (uint64, error) {
|
||||
var r uint64
|
||||
vlen := uint64(len(s))
|
||||
|
||||
for i := uint64(0); i < vlen; i++ {
|
||||
x := strings.IndexByte(alpha, s[i])
|
||||
if x == -1 {
|
||||
return 0, fmt.Errorf("Invalid character [%s]", s[i])
|
||||
}
|
||||
|
||||
if i == 0 {
|
||||
r += uint64(x)
|
||||
} else {
|
||||
r += (uint64(x+1) * pow(alphalen, i))
|
||||
}
|
||||
}
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func pow(a, b uint64) uint64 {
|
||||
p := uint64(1)
|
||||
for b > 0 {
|
||||
if b&1 != 0 {
|
||||
p *= a
|
||||
}
|
||||
b >>= 1
|
||||
a *= a
|
||||
}
|
||||
return p
|
||||
}
|
Reference in New Issue
Block a user