# @Time : 2025/03/29 8:00:00
# @File : rp_miner.py
# @Version : For JRRP 250329
# @Python : >=3.9, <4.0
import multiprocessing
from datetime import datetime, timedelta, timezone
from hashlib import sha256
from base64 import b85encode
TZ = timezone(timedelta(hours=8))
HASH_RANGE = 1 << 256
NAIVE_HASH = HASH_RANGE >> 1
# 在这里设置基本盐的前缀 (字符串) 以及QQ号 (整数)
BASE_SALT: str = "基本盐是可空的自定义前缀-"
QQ_NUMBER: int = 87654321
def get_prefix(user_id: int) -> bytes:
date_str = datetime.now(tz=TZ).strftime("%y%m")
prefix_int = int(f"{date_str}{user_id}")
n_bytes = (prefix_int.bit_length() + 7) // 8 or 1
return prefix_int.to_bytes(n_bytes, byteorder="big")
PREFIX = get_prefix(QQ_NUMBER)
def get_sha256_input(salt: str) -> str:
return b85encode(PREFIX + sha256(salt.encode()).digest()).decode()
def get_hash(text: str) -> int:
return int.from_bytes(sha256(text.encode()).digest(), "big")
def find_best_salt(chunk: int = 0, chunksize: int = 2**32) -> tuple[str, str]:
best_salt = ""
best_hash = HASH_RANGE - 1
start = chunk * chunksize
end = (chunk + 1) * chunksize
format_spec: str = "010x"
for i in range(start, end):
new_salt = BASE_SALT + format(i, format_spec)
text = get_sha256_input(new_salt)
if i % 5000000 == 1:
value_str = f"{best_hash:#066x}"[2:]
value_str_no_leading_zeros = value_str.lstrip("0")
leading_zeros_cnt = len(value_str) - len(value_str_no_leading_zeros)
print(
f"Process:{chunk:02} | Best Salt: {best_salt} | "
+ f"Hash Value: 0x({leading_zeros_cnt})-{value_str_no_leading_zeros}"
)
print(f"Process:{chunk:02} | Checking: {new_salt}")
hash_value = get_hash(text)
if hash_value < best_hash:
print(
f"Process:{chunk:02} | Best Salt Updated: {new_salt} | "
+ f"Hash Value: {hash_value:#066x}"
)
best_hash = hash_value
best_salt = new_salt
return best_salt, f"{best_hash:#066x}"
if __name__ == "__main__":
num_processes = 8 # 使用多进程
with multiprocessing.Pool(num_processes) as pool:
results = pool.map(find_best_salt, range(num_processes))
# results = [find_best_salt()] # 单进程
print(sorted(results, key=lambda x: x[1]))