>백엔드 개발 >Golang >입력에서 고유한 정수를 결정적으로 생성하는 방법은 무엇입니까?

입력에서 고유한 정수를 결정적으로 생성하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-02 12:41:17936검색

How to Deterministically Generate Unique Integers from Inputs?

입력에서 고유 정수의 결정론적 생성

중복을 방지하는 결정론적 정수를 생성하기 위한 솔루션을 찾을 때 문제는 변환을 찾는 것과 관련됩니다. 입력 숫자를 주어진 범위 내의 개별 출력에 매핑하는 방법(예: int64.

답은 Affine 암호에서 파생된 모듈러 연산을 적용하는 데 있습니다.

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

여기서:

  • n = 가능한 정수 범위(예: int64의 경우 2^64)
  • s < n
  • 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.