增加BV AV 互转的Golang 实现 (#480)

* 增加BV AV 互转的Golang 实现

* fix format

Co-authored-by: 社会易姐QwQ <45892418+SocialSisterYi@users.noreply.github.com>
This commit is contained in:
一心向晚 2022-09-14 15:14:35 +08:00 committed by GitHub
parent 8f9320eb45
commit 9322217103
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,27 +1,58 @@
# bvid说明
2020-03-23 B站推出了全新的稿件视频id“bvid”来接替之前的“avid”其用法与性质等价于“avid”
2020-03-23 B站推出了全新的稿件视频id`bvid`来接替之前的`avid`,其意义与之相同
详见:
1. [【升级公告】AV号全面升级至BV号专栏](https://www.bilibili.com/read/cv5167957)
2. [【升级公告】AV号全面升级至BV号](https://www.bilibili.com/blackboard/activity-BV-PC.html)
## 格式
---
- [概述](#概述)
- [格式](#格式)
- [实质](#实质)
- [avid发号方式的变化](#avid发号方式的变化)
- [算法概述](#算法概述)
- [av->bv算法](#av->bv算法)
- [bv->av算法](#bv->av算法)
- [编程实现](#编程实现)
- [Python](#Python)
- [C](#C)
- [TypeScript](#TypeScript)
- [Java](#Java)
- [Kotlin](#Kotlin)
- [Golang](#Golang)
---
## 概述
### 格式
“bvid”恒为长度为12的字符串前两个字母为大写“BV”后10个为base58计算结果
## 实质
### 实质
“bvid"为“avid”的base58编码可通过算法进行相互转化
## avid发放方式的变化
### avid发号方式的变化
从2009-09-09 09:09:09 [av2](https://www.bilibili.com/video/av2)的发布到2020-03-28 19:45:02 [av99999999](https://www.bilibili.com/video/av99999999)的发布B站结束了以投稿时间为顺序的avid发放改为随机发放avid
~~暗示B站东方要完泪目~~
## av->bv算法
## 算法概述
### av->bv算法
本算法及示例程序仅能编码及解码avid<` 29460791296 `无法验证avid>=` 29460791296 `的正确性
@ -53,13 +84,13 @@
算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)
## bv->av算法
### bv->av算法
为以上算法的逆运算
## 转换程序
## 编程实现
使用Python、C、TypeScript、Java以及Kotlin作为示例,欢迎社区提交更多例程
使用Python、C、TypeScript、Java、Kotlin以及Golang作为示例,欢迎社区提交更多例程
### Python
@ -97,7 +128,7 @@ BV17x411w7KC
170001
```
### C语言
### C
```c
#include <stdio.h>
@ -187,8 +218,8 @@ export default class BvCode {
const bvcode = new BvCode();
console.log(bvcode.bv2av('BV17x411w7KC'));
console.log(bvcode.av2bv(170001));
console.log(bvcode.bv2av('BV17x411w7KC'));
```
输出为:
@ -305,3 +336,55 @@ object VideoUtils {
}
```
### Golang
```golang
package main
import "math"
const TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
var S = [11]uint{11, 10, 3, 8, 4, 6}
const XOR = 177451812
const ADD = 8728348608
var TR = map[string]int64{}
// 初始化 TR
func init() {
for i := 0; i < 58; i++ {
TR[TABLE[i:i+1]] = int64(i)
}
}
func BV2AV(bv string) int64 {
r := int64(0)
for i := 0; i < 6; i++ {
r += TR[bv[S[i]:S[i]+1]] * int64(math.Pow(58, float64(i)))
}
return (r - ADD) ^ XOR
}
func AV2BV(av int64) string {
x := (av ^ XOR) + ADD
r := []rune("BV1 4 1 7 ")
for i := 0; i < 6; i++ {
r[S[i]] = rune(TABLE[x/int64(math.Pow(58, float64(i)))%58])
}
return string(r)
}
func main() {
println(AV2BV(170001))
println(BV2AV("BV17x411w7KC"))
}
```
输出为:
```
BV17x411w7KC
170001
```