비슷한 질문에 my answer에서 차용하고, 올바른 구문을 추측하려고 파이썬 문서에 잠깐 모습을 가지고 ...
당신이 게시 코드는 OK이지만 아마 이상 정밀도로 계산되는 대상이다 최적이며, 또한 상황을 느리게 만드는 부분이 포함됩니다.
는 2의 거듭 제곱에서 c
를 해결할 수 있습니다, 빨리 만들려면, 당신은 바이너리 &
(과) 대신이주는 모듈로,로 사용할 수 있습니다
과 동일
h(x) = (a * x + b) & ((1 << 32) - 1)
:
h(x) = (a * x + b) % 4294967296
당신이해야합니다과 동일
h(x) = (a * x + b) & (4294967296 - 1)
a
이 홀수 인 지 확인하십시오. c
이 2의 거듭 제곱 인 경우 c
과 공동 소수로 만드는 데 필요한 모든 것입니다. 이 예제는 출력 범위를 32 비트 정수로 제한합니다. 보시다시피 변경할 수 있습니다. 나는 파이썬의 한계가 무엇인지 모른다.
보다 많은 파라미터 화를 원하거나 결과가 "무작위"가 아니라는 것을 발견하면 (통계 테스트는 매우 빨리 실패하지만 대개 상관 없습니다) 더 많은 연산을 추가 할 수 있습니다. 덧셈과 곱셈의 사슬은 항상 한 쌍의 덧셈과 곱하기로 단순화되므로 여분의 연산으로는 아무 것도 고칠 수 없기 때문에 을 더 추가 할 수 없습니다.
대신 할 수있는 것은 bit shifts and exclusive-or을 사용하여 선형성을 해체하는 것입니다. 좋아요 :
def h(x):
x = x^(x >> 16)
x = (a * x + b) & ((1 << 32) - 1)
x = x^(x >> 16)
x = (c * x + d) & ((1 << 32) - 1)
x = x^(x >> 16)
return x
원하는 경우 변형 할 수 있습니다. b
과 d
을 0으로 설정하고 가운데를 16
으로 변경하면 MurmurHash3 finalizer 구조가됩니다. 대부분과 c
을 선택하면 대부분의 용도에 이상적입니다 (슬프게도 무작위 일 수는 없습니다).
출처
2016-10-18 20:21:59
sh1
코드를 보여주십시오. 우리가 당신이 불만족스러운 해결책을 어떻게 구현했는지 모른다면 당신을 도울 수 없습니다. 또는 오프 사이트 라이브러리 또는 리소스에 대한 제안을 요청하는 경우 StackOverflow에 대해 명시 적으로 오프 토픽입니다. – pjs
코드를 훨씬 빨리 만들려면 c를 2의 제곱으로 수정하고 a가 항상 이상하다는 것을 확인하십시오. 이렇게하면 a와 c가 co-prime (가능한 유일한 결과의 수를 극대화)하고 부울 산술로 효율적으로 모듈러스 연산을 수행 할 수 있습니다. – sh1