私のクライアントは 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にも同じことが必要です。