ホームページ >バックエンド開発 >Golang >1:1 マッピングで一意の決定論的な数値を生成するには?

1:1 マッピングで一意の決定論的な数値を生成するには?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-17 18:30:031061ブラウズ

How to Generate Unique, Deterministic Numbers with a 1:1 Mapping?

1:1 マッピングによる定数決定論的数値生成

目的

入力数値を一意にマッピングする決定論的関数を生成する指定された範囲内の数値を重複なく出力します。

メソッド

アフィン暗号に基づく剰余演算を利用します:

  1. 変換式: f(P) = (mP s) mod n
  2. パラメータ:

    • m: n と互いに素でなければならない(n と同じ数では割り切れません)。
    • s: n 未満の乱数。
    • n: 出力の目的の範囲。

uint64 の例

  • n = 2^64 (uint64 の範囲)
  • m = 39293 (奇数)
  • s = 75321908 (乱数

変換関数:

func transform(p uint64) uint64 {
    return m * p + s  // implicitly mod'd 2^64 by the type's size
}

int64 の例

符号付き数値の場合、一意のマッピングを維持するために uint64 と int64 の間で入力と出力を変換します:

func signedTransform(p int64) int64 {
    return int64(transform(uint64(p)))
}

保証

  • この関数は、すべての入力数値に対して 1:1 のマッピングを保証します。
  • 2 つの入力数値が同じ出力数値を生成することはありません。
  • 出力数値は、指定された範囲内で均一に分散されます。
  • 関数は決定的であり、指定された入力に対して常に同じ出力を生成します。

以上が1:1 マッピングで一意の決定論的な数値を生成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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