mirror of https://github.com/IoTcat/auxpi.git
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.
62 lines
1.4 KiB
62 lines
1.4 KiB
// Copyright (c) 2019 aimerforreimu. All Rights Reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
// |
|
// GNU GENERAL PUBLIC LICENSE |
|
// Version 3, 29 June 2007 |
|
// |
|
// Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> |
|
// Everyone is permitted to copy and distribute verbatim copies |
|
// of this license document, but changing it is not allowed. |
|
// |
|
// repo: https://github.com/aimerforreimu/auxpi |
|
|
|
package tools |
|
|
|
import ( |
|
"crypto/md5" |
|
"encoding/hex" |
|
"strconv" |
|
) |
|
|
|
const ( |
|
VAL = 0x3FFFFFFF |
|
INDEX = 0x0000003D |
|
) |
|
|
|
var ( |
|
alphabet = []byte("abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") |
|
) |
|
|
|
func ToShort(longURL string) ([4]string, error) { |
|
md5Str := getMd5Str(longURL) |
|
//var hexVal int64 |
|
var tempVal int64 |
|
var result [4]string |
|
var tempUri []byte |
|
for i := 0; i < 4; i++ { |
|
tempSubStr := md5Str[i*8 : (i+1)*8] |
|
hexVal, err := strconv.ParseInt(tempSubStr, 16, 64) |
|
if err != nil { |
|
return result, nil |
|
} |
|
tempVal = int64(VAL) & hexVal |
|
var index int64 |
|
tempUri = []byte{} |
|
for i := 0; i < 6; i++ { |
|
index = INDEX & tempVal |
|
tempUri = append(tempUri, alphabet[index]) |
|
tempVal = tempVal >> 5 |
|
} |
|
result[i] = string(tempUri) |
|
} |
|
return result, nil |
|
} |
|
|
|
/** generate md5 checksum of URL in hex format **/ |
|
func getMd5Str(str string) string { |
|
m := md5.New() |
|
m.Write([]byte(str)) |
|
c := m.Sum(nil) |
|
return hex.EncodeToString(c) |
|
}
|
|
|