🔍 许可证查询与验证

通过哈希值查询对应的许可证版本,或通过章节 ID 查询当前生效的许可证。

哈希值由 16 进制字符组成,共 96 位。可在许可证版本页面获取。
输入章节 ID,查询该章节当前生效的许可证(含继承链:章节 → 小说 → 默认)。
输入许可证哈希,查找哪些章节引用了此版本。
通过章节内容哈希查找发布时绑定的许可证快照(反欺诈追溯)。
内容将先移除所有空白字符再计算 SHA3-384 哈希。
内容将先移除所有空白字符(空格、换行、制表符等),然后计算 SHA3-384 哈希。

📘 哈希算法说明

许可证版本使用 SHA3-384 算法锁定,确保内容不可篡改。完整的哈希流程如下:

  1. 预处理:移除许可证正文中的所有空白字符(空格、制表符、换行符、回车符等)
  2. 编码:将预处理后的字符串以 UTF-8 编码为字节数组
  3. 哈希:使用 SHA3-384 (Keccak) 算法计算 48 字节摘要
  4. 输出:将摘要转为 96 位十六进制字符串

⚠️ 注意:这不是单纯的 SHA3-384,而是先进行空白字符预处理再哈希。这意味着 "Hello World""HelloWorld""Hello World" 会产生相同的哈希值。

🐍 Python 参考实现

任何人可使用此独立验证许可证哈希值。此参考实现与系统使用的算法完全一致。

"""
ShitNovel 许可证哈希算法 — 参考实现

预处理规则:移除所有空白字符(空格、制表符、换行符、回车符、垂直制表符等)
哈希算法:SHA3-384 (Keccak)
编码:UTF-8

用法:
  python hash_gen.py <文件路径>      # 计算文件哈希
  python hash_gen.py -              # 从 stdin 读取
  echo "content" | python hash_gen.py -
"""

import sys
import hashlib
import re


def preprocess(text: str) -> str:
    """移除所有空白字符"""
    return re.sub(r'\s+', '', text)


def compute_hash(text: str) -> str:
    """先预处理,再用 SHA3-384 哈希,返回十六进制字符串"""
    cleaned = preprocess(text)
    return hashlib.sha3_384(cleaned.encode('utf-8')).hexdigest()


def hash_file(filepath: str) -> str:
    """读取文件并计算哈希"""
    with open(filepath, 'r', encoding='utf-8') as f:
        text = f.read()
    return compute_hash(text)


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('用法: python hash_gen.py <文件路径>')
        print('      python hash_gen.py -  # 从 stdin 读取')
        sys.exit(1)

    if sys.argv[1] == '-':
        text = sys.stdin.read()
        print(compute_hash(text))
    else:
        filepath = sys.argv[1]
        print(hash_file(filepath))
✅ 验证示例
python hash_gen.py LICENSES/CC_BY_4.0.txt
💡 在线查询
使用上方表单粘贴哈希值或内容进行查询