原来自己统计的设备数,用IMEI和MAC地址全不准


先说下IMEI和MAC

IMEI码由GSM(Global
System for Mobile Communications,全球移动通信协会)统一分配,授权BABT(British approvals Board of Telecommunications,英国通信认证管理委员会)审受。

IMEI由15位数字组成,每位数字仅使用0~9的数字,其组成为:

1、前6位数(TAC,Type Approval Code)是“型号核准号码”,一般代表机型。

2、接着的2位数(FAC,Final Assembly Code)是“最后装配号”,一般代表产地

3、之后的6位数(SNR,Serial Number,出厂序号)是“串号”,一般代表生产顺序号。

4、最后1位数(SP)通常是“0”,为检验码,备用。

IMEI码具有唯一性,贴在手机背面的标志上,并且读写于手机内存中。它也是该手机在厂家的“档案”和“身份证号”。

如:SUMSUNG的一台GT-I9308手机的IMEI是:355065 05 331100 1/01。其中,355065是TAC,05是FAC,331100是SNR,1是SP,01是软件版本号。

MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责 IP地址,第二层数据链路层则负责
MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。我们有时候也误将它们当做是手机的物理地址。

为什么说它们不准呢?

大多数移动统计的 ID 都是通过系统 ID 生成的,包括但不限于 IMEI、MAC、Android ID。最著名的 ID 莫过于 UDID, 迫于隐私的压力,苹果最终废弃了 UDID 和 MAC 地址。

大多数网站统计都是基于 Cookie的,因此是暂态ID(Temporal ID)。OpenUDID 就是一个典型的暂态ID。

苹果的 IDFA 和 IDFV 都是系统ID,但是他们同时也是暂态ID。

2. ID质量

进行可区分统计的基础是确立一个可靠的身份标识符,这看上去是一个很简单的事情,只需要选择一个ID,或者人为构造一个类Cookie ID,就可以完成独立用户量、留存等分析。但遗憾的是,除了苹果已经废除的UDID,几乎没有一个接近完美的ID。

为了方便讨论,首先忽略假数据的存在,假设每个设备都有一个真实的身份标识X。可区分统计的目标是选择一个合适的身份标识I,使得基于I的统计结果尽可能地和 X 一致。

首先,我们引入两个概念ID冲突(Collision)和ID漂移(Jitter)。

ID冲突

对于某个设备集合(Device Cohort),在某个时间段内,总是可以测量 X 和 I 的数量,用 Count(X) 和 Count (I) 来表示。如果在足够短的时间内


1


Count(X) > Count(I)

我们称 I 是一个存在冲突的 ID。

ID漂移

对于某个设备集合(Device Cohort),在某个时间段内,总是可以测量 X 和 I 的数量,用 Count(X) 和 Count (I) 来表示。如果在足够长的时间内

[Java]
纯文本查看 复制代码

?


1


Count(X) < Count(I)

则我们称 I 是一个存在漂移的 ID。

Android 设备的IMEI 就是一个存在严重冲突的 ID,根据我们的估算,其冲突率大于 3%。这是因为很多山寨机的IMEI 是相同的。

Android 设备的 MAC 也是一个存在冲突的ID,因为很多山寨机的MAC也是相同的。此外,MAC还是一个典型的存在严重漂移的 ID,这是因为 Android 的源代码中有一段随机生成MAC  地址后24位的代码被滥用了

定性分析

接下来,我们可以定性分析一下ID冲突和漂移对统计数据的影响:

当一个ID仅存在冲突的时候,利用这个ID统计的DAU和安装都会被低估,但是有可能会高估留存。但是这些影响都是温和的,例如5% 的ID冲突仅仅会导致DAU至多被低估 5%,而对留存的影响几乎可以忽略。

当一个ID仅存在漂移的时候,利用这个ID统计的DAU和安装都会被高估,同时会影响留存。当漂移较大的时候,对统计指标的影响是剧烈的。例如,一个每日漂移为5%的ID,可能会造成DAU被高估2%,但是会每天造成5%的虚假安装(这是因为漂移会影响所有用户,包括不活跃用户),同时这些虚假安装的留存在短期内偏高,但是长期留存则偏低(短期内没有漂移的时候就会偏高,时间长了,漂移了就会偏低)。任何类Cookie的ID都会有类似的性质,因此传统的网站统计正在全面转向更为可靠的设备指纹。

当一个ID既存在冲突又存在漂移的时候,利用这个ID统计出来的DAU和安装是完全不可靠的。以MAC地址为例,存在漂移的这部分设备的MAC地址会频繁变化,因此会制造大量的虚假安装,同时留存率非常低。对于用户量不大的应用而言,选择存在这类ID的后果是灾难性的。

综上所述,当ID的漂移和冲突足够小的时候,他们对可区分统计的影响都是可以忽略的。当这些误差不可忽略的时候,ID的冲突造成的影响是温和的,而ID的漂移则会严重干扰安装和留存统计。

Android平台

对于Android平台,由于系统生态的开放性,ID的选择也一直是一个头疼的问题。

(1)单一ID

如前文所述,IMEI和MAC都不是最好的ID。特别是MAC地址,几乎是一个不可用的ID。

(2)组合ID

有些开发者会选择使用多个ID合并成一个组合ID,例如


1


CID = MD5( imei+mac+android_id)

利用前面的分析不难得出,组合ID将会极大地降低冲突,但是会放大漂移。对于组合ID而言,任何一个源ID的漂移都会造成它的漂移。

开发者应该尽量避免CID,一定要使用也需要避免使用MAC地址。如果已经在使用CID,那么请确保在下一个版本把CID当作一个Cookie ID持久化,只有在Cookie丢失的情况下才重新生成CID。这样的策略可以尽量保证ID的延续性,同时缓解漂移造成的影响。

时间: 2024-11-05 22:31:58

原来自己统计的设备数,用IMEI和MAC地址全不准的相关文章

在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案

在安卓6.0以下的设备上,通过WifiManager.getConnectionInfo().getMacAddress()即可获取WLAN物理地址, 而在6.0及以上,以此方式获取到的MAC地址为固定值02:00:00:00:00:00,而非真实值 解决方案 WlanMacAddressGetter.java package com.example.buyishi.myapplication; import android.util.Log; import java.net.NetworkIn

Visual Studio统计代码行数

Visual Studio统计代码行数 按[Ctrl+Shift+F]弹出查找窗口(不统计以#号开头.以/开头的代码和空行) 1.输入  :b*[^:b#/]+.*$ 2.选择使用正则表达式 3.查找文件类型,*.cs多种类型用分号(;)隔开 点击查找全部(查找结果如下)

VS统计代码行数 CTRL+SHIFT+F

1.CTRL+SHIFT+F (Find in files),打开查找功能(如果打不开查看本文最后)2. 勾选 使用:正则表达式,3. 搜索内容: ^:b*[^:b#/]+.*$ #开头和/开头或者空行都不计入代码量. ^:b*[^:b#/*]+.*$ *开头和#开头和/开头或者空行都不计入代码量. 4. 最后一行就是代码行数了. 匹配行:    匹配文件:    合计搜索文件: ----------------------------------------------------------

[转]Linux统计代码行数

wc -l *.c *.h 就可以知道当前目录下的所有c 和 h 文件的行数的详细信息.很不错 如果要递归,可以配合其他命令一起使用 当前目录及子目录: find . -name *.c |xargs wc -l find . -name *.cpp | xargs wc -l find . -name *.h |xargs wc -l 想一下子 ,或许简单的可以 使用重定向技术 使用 find -name "*.c">/tmp/file.list ;find -name &qu

【Linux】常用命令-统计代码行数

公司人员流动大,经常有新的维护任务,交接时喜欢看看新来的模块的代码量,那么问题来了, 如何统计代码行数? 1,最先想到的肯定是 wc. wc -l *.h 将查看[当前目录]下头文件的代码行数,输出结果如下: [groot]$wc -l *.h 54 consts.h 60 crc32.h 169 crypt.h 301 ebcdic.h 443 globals.h 39 inflate.h 81 timezone.h 227 ttyio.h 722 unzip.h 3123 unzpriv.h

一个统计代码行数的简单方法

安装Git, 到项目目录下右击->Git Bash, 输入命令: find . -name "*.cs" | xargs wc -l 效果如下, 还是挺简便的. 一个统计代码行数的简单方法,布布扣,bubuko.com

使用VS2010统计代码行数

代码行数统计 VS2010中本身集成了非常强大的查找功能,使用正则表达式可以非常快捷.准确的统计代码行数. 统计代码行数所用正则表达式: "^:b*[^:b#/]+.*$" 通过查找的功能选项还可以限定查找的文件类型,进而对指定范围的文件进行统计. 其中"#开头和/开头或者空行"都没有计入代码量,但是这个规则也不是特别严格,对于下面的情况不适用: /*xxxxxx *xxxxxxx *xxxxxxx *xxxxxxx*/ 总的来说大体上可以估计出代码的规模.

netstat--查看服务器[有效]连接数--统计端口并发数--access.log分析

简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等. 输出信息含义 执行netstat后,其输出结果为 ? ? Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 2 210.

MySQL 分组后,统计记录条数

分组后,统计记录条数: SELECT num,count(*) AS counts from test_a GROUP BY num; 查询结果如下: 对num去重后的数量的统计: SELECT count(t.counts) FROM ( SELECT num,count(*) AS counts from test_a GROUP BY num ) AS t; SELECT count(DISTINCT num) AS count FROM test_a; 它俩结果一样,都是5:只是一个是子