Wenn Sie die Zugriffsdaten für die Website im Formular session_id, ip, user_agent
und optional den Zeitstempel gemäß den folgenden Bedingungen angegeben haben, wie würden Sie die Sitzungen am besten zu eindeutigen Besuchern zusammenfassen?
session_id
: ist ein Ausweis, der jedem neuen Besucher ausgehändigt wird. Es verfällt jedoch nicht, wenn der Benutzer keine Cookies akzeptiert / Cookies löscht / den Browser ändert / das Gerät ändert, wird er nicht mehr erkannt
IP
kann zwischen verschiedenen Benutzern geteilt werden (Stellen Sie sich ein kostenloses Wi-Fi-Café oder Ihren ISP vor, der IPs neu zuweist), und sie haben oft mindestens 2, zu Hause und am Arbeitsplatz.
User_agent
ist die Browser- und Betriebssystemversion, mit der zwischen Geräten unterschieden werden kann. Beispielsweise wird ein Benutzer wahrscheinlich sowohl ein Telefon als auch einen Laptop verwenden, es ist jedoch unwahrscheinlich, dass er Windows + Apple-Laptops verwendet. Es ist unwahrscheinlich, dass dieselbe Sitzungs-ID mehrere Benutzeragenten hat.
Daten könnten hier wie die Geige aussehen: http://sqlfiddle.com/#!2/c4de40/1
Natürlich sprechen wir über Annahmen, aber es geht darum, der Realität so nahe wie möglich zu kommen. Wenn beispielsweise in einem begrenzten Zeitraum dieselbe IP-Adresse und derselbe Benutzeragent mit einer anderen Sitzungs-ID auftreten, ist die Annahme gerechtfertigt, dass es sich um denselben Benutzer handelt, abgesehen von einigen Ausnahmefällen.
Bearbeiten: Sprache, in der das Problem gelöst wird, ist irellevant, es geht hauptsächlich um Logik und nicht um Implementierung. Pseudocode ist in Ordnung.
Bearbeiten: Aufgrund der langsamen Natur der Geige können Sie alternativ die mysql lesen / ausführen:
select session_id, floor(rand()*256*256*256*256) as ip_num , floor(rand()*1000) as user_agent_id
from
(select 1+a.nr+10*b.nr as session_id, ceil(rand()*3) as nr
from
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)a
join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 union all select 0)b
order by 1
)d
inner join
(select 1 as nr union all select 2 union all select 3 union all select 4 union all select 5
union all select 6 union all select 7 union all select 8 union all select 9 )e
on d.nr>=e.nr