BV與AV號的算法流出?有點恐怖。

????最近B站的最大改動就是將AV號改為了BV號,BV號在AV號的基礎(chǔ)上更加難記,而且BV號使用了52進制,里面包括數(shù)字+小寫字母+大寫字母;
????在常人看起來AV號和BV號之間并沒有什么聯(lián)系,而BiliBili其實只是添加了一個可以當(dāng)做AV號的BV號,也就是說現(xiàn)在AV號還是可以用的,但你點進去的視頻默認導(dǎo)航是BV號,所以很多人一時不知道怎么看到視頻的AV號,一般的在BiliBili的官方Api接口中提供BV號便可解析出來視頻的相關(guān)信息,里面也就包括了AV號和BV號,在這種解析方式下,很多規(guī)則是無法使用的,比如斷網(wǎng)之后無法連接api接口,就會導(dǎo)致解析不出來,以及api接口的延遲等。
????那么在知乎上就有位大佬,mcfx,他通過對大量av號和bv號的分析,以及對進制的理解,得到了Python版的算法;放圖:

????那么這篇代碼因為使用的是python的代碼,在Up的能力下無法得到解析,首先就是計算溢出的問題,其次就是對python代碼過于生疏,所以Up在將其轉(zhuǎn)換到一半的時候就放棄了,還是API接口真香~
????那么今天的情況就比較好轉(zhuǎn),在其他的大佬帶領(lǐng)下,很多關(guān)于BV和AV號的運算分析視頻也相繼出來了,那么易語言版的源碼也是出來了,在我們的群內(nèi),Liv也是將C++版的寫出來了;
????那么根據(jù)源碼大概是這個樣子的:
原版{

.版本 2
.程序集 窗口程序集_啟動窗口
.程序集變量 s, 整數(shù)型, , "10"
.程序集變量 TR, 文本型, , "58"
.子程序 __啟動窗口_創(chuàng)建完畢
.局部變量 index, 整數(shù)型
s = { 10, 9, 2, 7, 3, 5 }
.計次循環(huán)首 (58, index)
? ? TR [index] = 取文本中間 (“fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF”, index, 1)
.計次循環(huán)尾 ()

.版本 2
.支持庫 eCalc
.子程序 AvToBv, 文本型
.參數(shù) av, 長整數(shù)型
.局部變量 x, 大數(shù)
.局部變量 i, 大數(shù)
.局部變量 Bv, 文本型, , "10"
.局部變量 a58, 大數(shù)
.局部變量 index, 整數(shù)型
.局部變量 a, 大數(shù)
.局部變量 ret, 文本型
i.導(dǎo)入數(shù)字 (位異或 (av, 177451812))
x.導(dǎo)入文本 (“8728348608”)
x = x.加 (i)
a58.導(dǎo)入數(shù)字 (58)
Bv = { “1”, “”, “”, “4”, “”, “1”, “”, “7”, “”, “” }
.計次循環(huán)首 (6, index)
? ? .如果 (index > 1)
? ? ? ? i = a58
? ? ? ? .計次循環(huán)首 (index - 2, )
? ? ? ? ? ? i = i.乘 (a58)
? ? ? ? .計次循環(huán)尾 ()
? ? .否則
? ? ? ? i.導(dǎo)入數(shù)字 (1)
? ? .如果結(jié)束
? ? Bv [s [index]] = TR [x.整除 (i).求余 (a58).導(dǎo)出整數(shù) () + 1]
.計次循環(huán)尾 ()
ret = “BV”
index = 0
.計次循環(huán)首 (10, index)
? ? ret = ret + Bv [index]
.計次循環(huán)尾 ()
返回 (ret)

.版本 2
.支持庫 eCalc
.支持庫 spec
.子程序 BvtoAv, 長整數(shù)型
.參數(shù) BV號, 文本型
.局部變量 index, 整數(shù)型
.局部變量 av, 大數(shù)
.局部變量 a58, 大數(shù)
.局部變量 BV, 文本型, , "10"
.局部變量 index2, 整數(shù)型
.局部變量 i, 大數(shù)
.局部變量 i_, 大數(shù)
.計次循環(huán)首 (10, index)
? ? BV [index] = 取文本中間 (BV號, index, 1)
.計次循環(huán)尾 ()
調(diào)試輸出 (“BV:”, BV)
index = 0
a58.導(dǎo)入數(shù)字 (58)
.計次循環(huán)首 (6, index)
? ? .如果 (index > 1)
? ? ? ? i = a58
? ? ? ? .計次循環(huán)首 (index - 2, )
? ? ? ? ? ? i = i.乘 (a58)
? ? ? ? .計次循環(huán)尾 ()
? ? .否則
? ? ? ? i.導(dǎo)入數(shù)字 (1)
? ? .如果結(jié)束
? ? .計次循環(huán)首 (58, index2)
? ? ? ? .如果真 (TR [index2] = BV [s [index]])
? ? ? ? ? ? i_.導(dǎo)入數(shù)字 (index2 - 1)
? ? ? ? ? ? i = i.乘 (i_)
? ? ? ? ? ? 跳出循環(huán) ()
? ? ? ? .如果真結(jié)束
????.計次循環(huán)尾 ()
? ? av = av.加 (i)
? ? 調(diào)試輸出 (AV號.導(dǎo)出長整數(shù) ())
.計次循環(huán)尾 ()
i.導(dǎo)入文本 (“8728348608”)
返回 (位異或 (av.減 (i).導(dǎo)出長整數(shù) (), 177451812))
}
那么這個代碼和那篇的python代碼是有很多不同的,Up也是有很多地方搞不懂,真讓人頭大;
????UP主對照著代碼流程自己寫了一遍BV轉(zhuǎn)AV的,用了中文的變量希望大家能看懂:
UP主版的{

.版本 2
.支持庫 eCalc
.程序集 窗口程序集_窗口1
.程序集變量 table, 文本型, , "0"
.程序集變量 tr, 文本型, , "0"
.程序集變量 xor, 長整數(shù)型
.程序集變量 s, 整數(shù)型, , "10"
.程序集變量 add, 大數(shù)
.子程序 _窗口1_創(chuàng)建完畢
.局部變量 i, 整數(shù)型
' fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF
.計次循環(huán)首 (58, i)
? ? 加入成員 (table, 取文本中間 (“fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF”, i, 1))
.計次循環(huán)尾 ()
復(fù)制數(shù)組 (tr, table)
s = { 10, 9, 2, 7, 3, 5 }
xor = 177451812
add.導(dǎo)入文本 (“100618342136696320”)

.版本 2
.支持庫 eCalc
.支持庫 spec
.子程序 BVAV, 長整數(shù)型
.參數(shù) BV號, 文本型
.局部變量 計次X, 整數(shù)型
.局部變量 計次X2, 整數(shù)型
.局部變量 BV, 文本型, , "10"
.局部變量 AV號, 大數(shù)
.局部變量 運算i, 大數(shù)
.局部變量 運算i2, 大數(shù)
.局部變量 臨時處理大數(shù), 大數(shù)
臨時處理大數(shù).導(dǎo)入數(shù)字 (58)
.如果真 (取文本左邊 (BV號, 2) = “BV”)
? ? BV號 = 取文本右邊 (BV號, 取文本長度 (BV號) - 2)
.如果真結(jié)束
.計次循環(huán)首 (10, 計次X)
? ? BV [計次X] = 取文本中間 (BV號, 計次X, 1)
.計次循環(huán)尾 ()
.計次循環(huán)首 (6, 計次X)
? ? .判斷開始 (計次X > 1)
? ? ? ? 運算i.導(dǎo)入數(shù)字 (58)
? ? ? ? .計次循環(huán)首 (計次X - 2, )
? ? ? ? ? ? 運算i = 運算i.乘 (臨時處理大數(shù))
? ? ? ? .計次循環(huán)尾 ()
? ? .默認
? ? ? ? 運算i.導(dǎo)入數(shù)字 (1)
? ? .判斷結(jié)束
? ? .計次循環(huán)首 (58, 計次X2)
? ? ? ? .如果真 (tr [計次X2] = BV [s [計次X]])
? ? ? ? ? ? 運算i2.導(dǎo)入數(shù)字 (計次X2 - 1)
? ? ? ? ? ? 運算i = 運算i.乘 (運算i2)
? ? ? ? ? ? 調(diào)試輸出 (運算i.導(dǎo)出長整數(shù) (), 計次X2, 計次X)
? ? ? ? ? ? 跳出循環(huán) ()
? ? ? ? .如果真結(jié)束
????.計次循環(huán)尾 ()
? ? AV號 = AV號.加 (運算i)
.計次循環(huán)尾 ()
運算i.導(dǎo)入文本 (“8728348608”)
返回 (位異或 (AV號.減 (運算i).導(dǎo)出長整數(shù) (), xor))
}
具體是哪點Up主沒能搞懂,相信大家對照一下源碼與Python的代碼就知道了;
首先就是 tr 和 xor ,其次就是 add 徹底不見了;當(dāng)然 s 也從 {11,10,3,8,4,6,2,9,5,7}
變?yōu)榱耍簊 = { 10, 9, 2, 7, 3, 5 }
講了這么多,最后奉上下載地址吧。
原版的:https://www.lanzous.com/iam1qpe
UP主的:https://www.lanzous.com/iam1qqf