我的客户是一名 Python 程序员,我为他创建了一个 C++ 后端,其中包括许可证生成和检查。为了提高安全性,Python 前端还将执行许可证的有效性检查。
然而,许可证生成和检查算法基于散列方法,该方法依赖于整数具有固定字节大小的事实,并且对值进行位移不会扩展整数字节数。
这是一个简化的示例代码:
unsigned int HashString(const char* str) {
unsigned int hash = 3151;
while (*str != 0) {
hash = (hash << 3) + (*str << 2) * 3;
str++;
}
return hash;
}
如何将其翻译成 Python?直接翻译显然会产生不同的结果:
def hash_string(str):
hash = 3151
for c in str:
hash = (hash << 3) + (ord(c) << 2) * 3
return hash
例如:
hash_string("foo bar spam") # 228667414299004
HashString("foo bar spam") // 3355459964
编辑:PHP 也需要这样做,因为在线商店也应该能够生成有效的许可证。