Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1


Stary wyjadacz :P



Wiem że może to zabrzmi troszkę dziwacznie (nie chce za bardzo rozpisywać dlaczego potrzebuje tego )
chodzi o to że z dwóch użytkowników o unikalnych ID ( liczba uint) chcę otrzymać unikalną liczbę całkowitą (dowolnym sposobem)
tak aby dla innych par użytkowników uzyskany wcześniej wynik nie występował , lecz nie znalazłem odpowiedzi w sieci na moje pytanie , więc pytam was , spotkał się ktoś z was z czymś podobnym ? lub zna algorytm który mógłby mnie naprowadzić na rozwiązanie problemu ?
Offline




Użyszkodnik
Suma kwadratów?
Offline


Stary wyjadacz :P



Troszkę duże liczby wychodzą ,myślę aby wynik Twój poddać pierwiastkowki kwadratowemu i zaokrągleniu w dół/górę ,
pudło , wyniki są podobne
może ktoś ma inne sugestie ??
Ostatnio edytowany przez szewczyk (2012-02-18 21:07:28)
Offline


Członek DUG
Moje rozumienie:
a + b == Z
c + d == Y != Z
d + a == X != Y != Z
d + e == V != X != Y != Z
...
Takie pytanka...
1. Czy te "unikalne ID użytkownika" oraz "unikalna liczba całkowita (pary)" są w jakiś sposób ograniczone? uint32, uint64, uint8, itp.
2. Czy "unikalne ID użytkownika" i "unikalna liczba całkowita (pary)" są powiązane także unikalnością czy mogą być takie same, np. 3-ka użytkownika i 3-ka pary
Pomysł... Hmm... Konkatencja wyrównanych ajdików (alignment id, np. 0x000d i 0x0600)
Ostatnio edytowany przez NIC (2012-02-18 21:08:05)
Offline

Członek DUG
Nie znajdziesz wyniku, który nie będzie się zwiększał bardzo szybko (przynajmniej ja nic nie wymyśliłem :P)
Coś co zadziała (raczej) to:
f(x) - funkcja zwracająca wartość n-tej liczby pierwszej
g(u1,u2) - nowy hash
g(u1,u2) = f(u1)*f(u2) - przy założeniu, że g(u1,u2) = g(u2,u1)
Jeżeli powyższe założenie jest nieprawdziwe to musimy jeszcze dodać 1 jeżeli u2>u1 (lub odwrotnie).
Co do tego ostatniego to nie jestem pewien czy na pewno jest to dobre rozumowanie, ale gwarancji nie daje.
Co do pierwszego to rozkład dowolnej liczby na czynniki pierwsze zawsze jest określany jednoznacznie. Tzn dana liczba jest uzyskiwana z jednej wariancji liczb pierwszych. Dlatego mnożąc dwie liczby pierwsze otrzymamy liczbę której rozkład posiada dokładnie dwa czynniki pierwsze.
Offline

Użytkownik


Gdy oba unikalne ID są typu uint to masz 4294967296 unikalnych numerów. Masz wtedy 9223372034707292160 unikalnych par.
Unikalną liczbę z 2 par uzyskasz najprościej tak:
unsigned long long pair_id = MAX(id1, id2) + MIN(id1, id2) * 4294967296
A to znalazłem w sieci:
http://board.flashkit.com/board//showthread.php?t=805270
Ostatnio edytowany przez panjandrum (2012-02-18 22:58:54)
Offline



Zubr, bydle na etacie.




jako id kolejne liczby pierwsze pewnie zdaly by egzamin.
Offline


Stary wyjadacz :P



panjandrum rozwiązanie z linku jest pewne że uzyskam unikalny wynik ,lecz zależy mi aby wynik był typu INT :(
ale rozwiązanie rozwiązanie zaproponowane przez Ciebie wygląda na trafne :)
wrzucę zaraz w kod i sprawdzę .dzięki !!!!!!!
Offline
Strony: 1