44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package utils
|
||
|
||
import (
|
||
"crypto/md5"
|
||
"fmt"
|
||
"strconv"
|
||
)
|
||
|
||
const charset = "A0a12B3b4CDc56Ede7FGf8Hg9IhJKiLjkMNlmOPnQRopqrSstTuvUVwxWXyYzZ"
|
||
|
||
func generateCharset(url, hexMd5 string, len, sectionNum int, cb func(url, keyword string) bool) string {
|
||
for i := 0; i < sectionNum; i++ {
|
||
sectionHex := hexMd5[i*8 : 8+i*8]
|
||
bits, _ := strconv.ParseUint(sectionHex, 16, 32)
|
||
bits = bits & 0x3FFFFFFF
|
||
keyword := ""
|
||
for j := 0; j < len; j++ {
|
||
idx := bits & 0x3D
|
||
keyword = keyword + string(charset[idx])
|
||
bits = bits >> 5
|
||
}
|
||
if cb(url, keyword) {
|
||
return keyword
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// 起初生成6位的短码,当四组6位短码都重复时,再生成8位的短码,因此总共会有8个短码供你选择。
|
||
|
||
func GenerateShortUrl(url string, cb func(url, keyword string) bool) string {
|
||
if url == "" || cb == nil {
|
||
return ""
|
||
}
|
||
hexMd5 := fmt.Sprintf("%x", md5.Sum([]byte(url)))
|
||
sections := len(hexMd5) / 8
|
||
|
||
keyword := generateCharset(url, hexMd5, 6, sections, cb)
|
||
if keyword == "" {
|
||
return generateCharset(url, hexMd5, 8, sections, cb)
|
||
}
|
||
return keyword
|
||
}
|