오늘 흥미로운 문제가 발생하여 해결책을 찾기 위해 인터넷을 검색했지만 아무 것도 찾지 못했습니다. 문제는 다음과 같습니다.무작위 1 대 1 해시 함수
사용자가 계정을 만들고 자신의 계정을 나타내는 고유 한 ID 번호 (예 : 123)가 부여됩니다. 다른 사용자가 계정을 만들 때 가장 최근에 생성 된 ID 번호에 1을 더하고이를 124에 할당 할 수 있습니다. 그러나 사용자 123이 그에게 등록되었다는 것을 이제 알았으므로 모든 사람을 완전히 익명화하지는 않습니다. 아주 작은 문제이지만 생각할 수있는 상황에 따라 더 큰 문제가 발생할 수 있습니다.
누가 더 먼저 왔는지 알 수 없도록 더 나은 해결책은 임의이지만 고유 한 ID를 갖는 것입니다.
이 문제를 해결하려면 표준 해시 함수 또는 난수 생성기를 사용하여 각 사람마다 고유 한 ID를 만들 수 있지만 충돌 가능성이 있습니다. 충돌을 확인하고 다시 실행하면이 문제를 피할 수 있지만이 예에서는 시스템의 속도가 느려질 것이라고 가정 해 봅시다. 또는 생성기가 불완전한 정보로 실행 중일 수 있으며 충돌이 있는지 확인할 수 없습니다.
내가 생각해 낸 다른 생각은 기본적으로 새로운 ID가 필요할 때 언제든지 상단에있는 카드를 쌓고 꺼내는 카드를 섞은 것입니다. 덱에서 카드가 떨어지면 마지막 덱의 가장 높은 카드에서 새 덱을 섞어서 섞습니다. 이 단점은 카드의이 데크를 보관해야하며 실수로 갑판을 잃어 버리면 다시 만들거나 계속하지 말고 많은 문제가 발생한다는 것입니다.
아주 비슷한 해결책은 매번 고정 시드를 기반으로이 셔플 데크를 다시 만들고 맨 위 대신 갑판의 n 번째 카드를 가져 오는 것입니다. 이 문제는 새로운 카드가 필요할 때마다이 덱을 섞는 데 많은 비용이 듭니다.
내가 생각해 보았던 다른 수학적 모델은 시퀀스의 다음 숫자가 예측 가능하다는 문제가 있습니다 (각 숫자는 이전 숫자와 고정 된 양입니다). 많은 사람들이 충돌을 겪는 문제가 있습니다.
내 질문은 : 거기에 "갑판"(읽기 : 배열) 메모리를 저장하거나 모든 함수 호출에서 다시 계산할 필요가없는 고유 ID를 얻으려면 숫자를 연결할 수있는 몇 가지 수학적 모델이 있습니까?
예를
randomID(number, seed, range)
randomID(1,123,1000) = 284
randomID(2,123,1000) = 739
randomId(3,123,1000) = 088
randomId(3,888,1000) = 912
위해 나는 유망한 것으로 보인다 https://code.google.com/p/smhasher/wiki/MurmurHash3를 보았다,하지만 난 그것을 숫자의 임의의 범위에서 적용, 만 32 비트 또는 64bit를 통해 생각하지 않습니다.
축하합니다! 당신은 방금 GUID를 생각해 냈습니다 : http://stackoverflow.com/questions/371762/what-exactly-is-guid-why-and-where-i-should-use-it – trailmax
왜 trailmax의 대답이 코멘트인지 모르겠습니다. ,하지만 그것은 좋은 대답입니다. 대부분의 언어에는 GUID를 생성하는 라이브러리가 있습니다. 이 값은 고유 한 것이 아니라 충돌의 확률이 천문학적으로 작아서 모든 실제적인 목적으로 고유 한 순차적이지 않은 ID로 작동합니다. –