入力からの一意の整数の決定論的生成
重複を避ける決定論的な整数を生成するための解決策を求めるとき、問題は変換を見つけることを中心に展開します。入力数値を指定範囲内の個別の出力にマッピングするメソッド。 int64.
答えは、アフィン暗号から派生したモジュラー算術を適用することにあります:
f(P) = (mP + s) mod n
ここで:
適切な m と s を選択することで、この式は入力数値の一意のマッピングを保証します。指定された範囲内の整数を出力します。たとえば、int64 の場合:
m = 39293 (any non-even number) s = 75321908 (any random number below 2^64)
これらの値を使用すると、変換関数:
func transform(p uint64) uint64 { return p*m + s }
は、次の Go プレイグラウンドで示すように、各入力整数が一意の出力整数を生成することを保証します。例:
https://go.dev/play/p/EKB6SH3-SGu
負の数の場合、ロジックは同じままです。 uint64 と int64 の間で入力と出力を変換するだけで、一意のマッピングを維持できます。
func signedTransform(p int64) int64 { return int64(transform(uint64(p))) }
このアプローチにより、特定の範囲内のすべての可能な整数が、衝突することなく決定論的に個別の出力整数にマッピングされます。
以上が入力から一意の整数を決定的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。