Apply .gitignore rules
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
/*
|
||||
提供调试功能的助手包
|
||||
*/
|
||||
package debugUtil
|
||||
@@ -0,0 +1,98 @@
|
||||
package hash64
|
||||
|
||||
/*
|
||||
* ***注意***
|
||||
*
|
||||
* Sum 使用的是[]byte参数;string中文是utf-8编码
|
||||
* SumByRune 使用的是[]rune参数;中文使用的是unicode编码
|
||||
*
|
||||
* 两种参数中文编码不同;同一个string调用两个接口得到的hash是不同的!!! 这是要特别注意的
|
||||
*
|
||||
* 对string进行for range操作会自动被[]rune化;一定要注意!!!
|
||||
*
|
||||
*/
|
||||
|
||||
const shiftBit = 23 // 每个字节移位数(测试经验值23)
|
||||
const reverseBit = 64 - shiftBit
|
||||
|
||||
// 快速Hash计算(*** 注意:只取了rune低16位进行hash计算;计算结果与SumByRune不一致 ***)
|
||||
func FastSumByRune2(in rune, hs uint64) (out uint64) {
|
||||
out = ((hs << shiftBit) | (hs >> reverseBit)) + uint64(byte(in>>8))
|
||||
out = ((out << shiftBit) | (out >> reverseBit)) + uint64(byte(in))
|
||||
return
|
||||
}
|
||||
|
||||
// 快速Hash计算(*** 此计算结果与SumByRune一致 ***)
|
||||
func FastSumByRune4(in rune, hs uint64) (out uint64) {
|
||||
out = ((hs << shiftBit) | (hs >> reverseBit)) + uint64(byte(in>>24))
|
||||
out = ((out << shiftBit) | (out >> reverseBit)) + uint64(byte(in>>16))
|
||||
out = ((out << shiftBit) | (out >> reverseBit)) + uint64(byte(in>>8))
|
||||
out = ((out << shiftBit) | (out >> reverseBit)) + uint64(byte(in))
|
||||
return
|
||||
}
|
||||
|
||||
// 原Hash值参数重
|
||||
func hsArg(hsOpt ...uint64) (out uint64) {
|
||||
out = uint64(0)
|
||||
if len(hsOpt) > 0 {
|
||||
out = hsOpt[0]
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Hash计算
|
||||
// in - 待hash串
|
||||
// hsOpt - 原hash值(在此基础上继续hash)
|
||||
func Sum(in []byte, hsOpt ...uint64) (out uint64) {
|
||||
out = hsArg(hsOpt...)
|
||||
for _, v := range in {
|
||||
out = ((out << shiftBit) | (out >> reverseBit)) + uint64(v)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Hash计算
|
||||
func SumByRune(in rune, hsOpt ...uint64) (out uint64) {
|
||||
// rune转[]byte
|
||||
inVal := make([]byte, 4)
|
||||
inVal[0] = byte(in >> 24)
|
||||
inVal[1] = byte(in >> 16)
|
||||
inVal[2] = byte(in >> 8)
|
||||
inVal[3] = byte(in)
|
||||
|
||||
// *** 经实际测试:不加以下代码运行效率更高 ***
|
||||
|
||||
// 去除前面多余的\x00
|
||||
// for {
|
||||
// if len(inVal) <= 1 {
|
||||
// // 以免全0异常;至少要保留1位
|
||||
// break
|
||||
// }
|
||||
// if inVal[0] == 0 {
|
||||
// inVal = inVal[1:]
|
||||
// } else {
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// 规避hash冲突,如:"N-"与"中"unicode编码均为#4E2D,即会产生hash冲突
|
||||
// 若长度>1(即非常规ASCII),所有字节最高位置1
|
||||
// if len(inVal) > 1 {
|
||||
// for i := 0; i < len(inVal); i++ {
|
||||
// inVal[i] |= 0x80
|
||||
// }
|
||||
// }
|
||||
out = Sum(inVal, hsOpt...)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Hash计算
|
||||
func SumByRunes(in []rune, hsOpt ...uint64) (out uint64) {
|
||||
out = hsArg(hsOpt...)
|
||||
for _, v := range in {
|
||||
out = SumByRune(v, out)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package deviceUtil
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// 将MAC地址转化为标准格式
|
||||
func ConvertMacToStandardFormat(mac string) string {
|
||||
if mac == "" || mac == "00:00:00:00:00:00" || mac == "02:00:00:00:00:00" {
|
||||
return ""
|
||||
}
|
||||
|
||||
//如果mac的长度不为12或17,则是不正确的格式
|
||||
if len(mac) != 12 && len(mac) != 17 {
|
||||
return ""
|
||||
}
|
||||
|
||||
|
||||
//转化为大写
|
||||
mac = strings.ToUpper(mac)
|
||||
|
||||
//如果mac地址的长度为17(已经有:),则直接返回
|
||||
if len(mac) == 17 {
|
||||
return mac
|
||||
}
|
||||
|
||||
//如果没有分隔符,则添加分隔符
|
||||
newMac := make([]rune, 0, 17)
|
||||
for i, v := range []rune(mac) {
|
||||
newMac = append(newMac, v)
|
||||
if i < len(mac) - 1 && i % 2 == 1 {
|
||||
newMac = append(newMac, ':')
|
||||
}
|
||||
}
|
||||
|
||||
return string(newMac)
|
||||
}
|
||||
|
||||
func ConvertIdfaToStandardFormat(idfa string) string {
|
||||
//如果是空或默认值,则返回String.Empty
|
||||
if idfa == "" || idfa == "00000000-0000-0000-0000-000000000000" {
|
||||
return ""
|
||||
}
|
||||
|
||||
//如果idfa的长度不为32或36,则代表是Android的数据,则可以直接返回
|
||||
if len(idfa) != 32 && len(idfa) != 36 {
|
||||
return idfa
|
||||
}
|
||||
|
||||
//转化为大写
|
||||
idfa = strings.ToUpper(idfa);
|
||||
|
||||
//如果idfa地址的长度为36(已经有:),则直接返回
|
||||
if len(idfa) == 36 {
|
||||
return idfa
|
||||
}
|
||||
|
||||
//如果没有分隔符,则添加分隔符
|
||||
newIdfa := make([]rune, 0, 36)
|
||||
for i, v := range []rune(idfa) {
|
||||
newIdfa = append(newIdfa, v)
|
||||
if i == 7 || i == 11 || i == 15 || i == 19 {
|
||||
newIdfa = append(newIdfa, '-')
|
||||
}
|
||||
}
|
||||
|
||||
return string(newIdfa)
|
||||
}
|
||||
|
||||
// 根据MAC和IDFA获取唯一标识
|
||||
func GetIdentifier(mac, idfa string) string {
|
||||
mac = ConvertMacToStandardFormat(mac)
|
||||
idfa = ConvertIdfaToStandardFormat(idfa);
|
||||
|
||||
//如果idfa不为空,则使用idfa,否则使用mac
|
||||
if idfa != "" {
|
||||
return idfa
|
||||
} else {
|
||||
return mac
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user