ホームページ >バックエンド開発 >Golang >入力から一意の整数を決定的に生成するにはどうすればよいですか?

入力から一意の整数を決定的に生成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 12:41:17934ブラウズ

How to Deterministically Generate Unique Integers from Inputs?

入力からの一意の整数の決定論的生成

重複を避ける決定論的な整数を生成するための解決策を求めるとき、問題は変換を見つけることを中心に展開します。入力数値を指定範囲内の個別の出力にマッピングするメソッド。 int64.

答えは、アフィン暗号から派生したモジュラー算術を適用することにあります:

f(P) = (mP + s) mod n

ここで:

  • n = 可能な整数の範囲 (例: 2^64 (int64)
  • s
  • m は n と互いに素です (1 以外の共通因数を共有しないことを意味します)

適切な 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。