>> 算法讨论区
※ 所有参选的开源项目需使用通过 OSI 认证的协议、或木兰许可证。若在最终榜单发现不符合要求的项目,会将其从榜单移除。
本次年度评选将根据 “热度值” 高低选出排名前 15 的开源项目,并为其颁发「最火热中国开源项目社区」奖项。
已被 OSCHINA 收录的开源项目(开源协议需使用 OSI 认证的协议、或木兰许可证)都默认参与评选。在评选期间,每个开源项目的主页都会添加 “热度” 挂件,如下图所示:
我们提供了两种方式让用户为开源项目贡献热度。
一、常规方式
用户只需点击右侧的蓝色按钮即可为想要支持的开源项目贡献 “热度”。
每点击一次「贡献热度」按钮,随机给该项目的热度值加 1 或 10。该按钮支持连击,并且每位用户贡献 “热度” 的次数不受限制。请注意:进度圈加载过程中,不要关闭页面,否则会导致丢失 “热度值”。
二、极客玩法(类似 “挖矿”)
相比常规方式的手动 “点击按钮”,极客玩法让程序员能够用自己擅长的方式来贡献 “热度”,效率更高,更具可玩性。
上文提到,用户每次点击按钮所贡献的热度并不是固定的,因为我们采用 “工作量证明 (Proof-of-Work,PoW)” 设计了计算热度的规则,所以用户完成计算的工作量越大,能贡献的热度更高。
工作量证明是一种用来证明某项计算是困难,并且不能被快速完成的方法。它的基本思想是,为了完成一项特定的工作,必须要进行大量的计算。
工作量证明通常由两类主要参与方协作完成:提出者和验证者。提出者负责提交一个解决问题的证明,而验证者负责验证提交的证明是否正确。如果验证者发现证明是正确的,他们就会批准这个证明,并将其广播到网络中。
因此除了通过常规的点击按钮贡献热度,在 PoW 机制下,我们设计了另一种能贡献热度的玩法:
- 用户自行编写算法函数在本地完成 “计算”
- 将 “计算” 的证明提交给 OSCHINA
- 如果该 “计算” 的证明通过验证,则为对应开源项目添加相应的热度值
具体来说就是:用户将 开源项目 ID(浏览器控制台输入 page.objId 获取)、用户 ID(浏览器控制台输入 page.g_user_id 获取)和 token (自定义随机字符串,不能重复,长度上限 255) 作为变量,然后自行编写算法函数,并根据上述变量生成哈希值,如果生成的哈希值满足以下条件,并通过服务器端的验证,即可成功为开源项目贡献热度。
热度计算规则如下:
-
生成的哈希值前五位是 0,通过服务器端验证后,开源项目获得的热度值为 1
-
生成的哈希值前六位是 0,通过服务器端验证后,开源项目获得的热度值为 10
-
生成的哈希值包含 oschina 字符(不区分大小写),无论位置在哪,通过服务器端验证后,开源项目获得的热度值为 10000
下面是使用 JavaScript 实现的示例算法函数:
/**
*
* oscid:用户id
* projectid:开源项目id
*
*
* return genkey 用来生成最终结果hash的字符串格式如下
* 软件id:osc用户id:计算总数:种子字符串
* res 最后生成的hash 根据前缀的0或者内含oschina字符串为一个合法hash
*
*/
function find(oscid,projectid){
let IsOk = true
let counter = 0
while (IsOk) {
let token = Math.random().toString(36).slice(-8)
for (i = 0; i < 999999; i++) {
let genkey = projectid+":"+oscid+":" + counter + ":" + token
let testres = sha1(genkey)
if (testres.startsWith("00000")) {
return { "user": oscid, "project": projectid, "token": token, "counter": counter }
}
if(testres.toLowerCase().indexOf("oschina")!==-1){
return { "user": oscid, "project": projectid, "token": token, "counter": counter }
}
counter=counter+1
}
}
}
完成本地计算后,用户需要将获得的 “计算” 证明提交到 OSCHINA 进行验证。
提交接口:http://www.oschina.net/action/api/pow
格式如下:
[
{
"user":998789, //用户id
"project":12, //开源项目id
"token":"6q1lczlk", //用于验证的token
"counter":529689 //计算总数
}
]
提交 “计算” 证明示例(为了降低服务器压力,请尽量批量提交)。另外,由于存在缓存,如果发现成功提交后热度值没有更新,请过两分钟再刷新页面查看。
- 通过 curl
curl --request POST \
--url 'https://www.oschina.net/action/api/pow?filter=(created%3E'\''2022-10-14%2010%3A26%3A21.322'\'')' \
--header 'Content-Type: application/json' \
--cookie _user_behavior_=3002f72d-c0a3-438a-a30d-f5a9075c6d14 \
--data '[
{
"user":12,
"project":49376,
"token":"kuhdgazm",
"counter":1343290
}
]'
成功提交会返回如下信息:
重复提交返回如下信息:
注意,请勿重复提交或攻击服务器,否则会被取消相应的热度值和参与资格。
如有问题,请添加工作人员微信进群:564728101。(备注:oschina)
同时,我们创建了讨论帖让大家分享各自编写的算法函数,欢迎一起来玩!