精华内容
下载资源
问答
  • 用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户。01 为什么要建设用户唯一标识如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情。因为如果做...

    用户唯一标识,是用户唯一的身份ID,相同的身份ID,就会被当做是相同的一个用户。

    fa9b375464d2a0bc3ab73c257de0d7a7.png

    01 为什么要建设用户唯一标识

    如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情。因为如果做不到用户的唯一识别,那凡是涉及到用户的数据都将是错的(比如用户量、新增用户数、活跃用户数等等)。所以建设用户唯一标识,尤为重要。

    02 基本概念

    设计埋点字段的时候,有两个字段是一定要包括的,即设备ID和用户ID。这两个字段应该纳入通用字段,每个埋点的事件都必须要集成收集。

    (1)设备ID

    使用相应的算法,生成一个设备ID,以唯一识别用户的终端设备。不同终端的设备ID,其生成算法规则不一样,以下列举不同终端的设备ID的生成规则:

    AndroidApp

    安卓系统历经多次升级,对权限控制越来越严格,唯一识别手机的方法也在发生变化。下面整理一下安卓系统适合做设备唯一标识符的几个标识符,以及其特性:

    14e62ac76f057e850bf74a364d03f76a.png

    从表格中看出,IMEI是最适合做设备唯一标识的,奈何获取IMEI需要授予权限且Android 10以后不再开放IMEI的权限。综合起来,安卓系统中,应该按照IMEI ->OAID -> ANDROID_ID的顺序生成设备ID。即先获取IMEI号,获取不到IMEI时获取OAID,获取不到OAID时,再获取ANDROID_ID,然后使用相关算法生成设备ID。

    IOS App

    苹果系统,可用于识别唯一设备的标识不多,如下图。综合起来,苹果系统生成设备ID的标识符顺序应该是IDFA -> IDFV ->UDID,即先获取IDFA,获取不到在获取IDFV,获取不到IDFV时,再获取UDID,然后使用相关算法生成一个设备ID。

    6e3622c24a668c4e0c93563399b1bfac.png

    Web网站

    Web网站,使用cookie_id作为设备ID,并存储在浏览器的cookie中。

    微信小程序

    通常做法使用openid作为设备ID,当然也可以自己生产一个ID,作为设备ID。如果用过openid作为设备ID,需要注意微信小程序的冷启动问题(获取 openid 是一个异步的操作,所以会导致数据上报的时候,可能还没获取到openid,这就是导致设备ID为空)。

    2)用户ID

    用户ID,即用户在业务产品注册的用户账号。

    收集到设备ID和用户ID后,就要想办法将设备ID和用户ID关联起来,也即用户唯一标识建模,详见下文。

    03 用户唯一标识建设

    设计一个字段,比如就叫distinct_id(设备ID命名为device_id,用户ID命名为user_id)这个字段用于识别唯一用户。凡是统计用户相关的数据时,都以distinct_id作为用户的唯一区别标识。下面,以具体案例进行阐述。

    bd3d825630d6fe38e1d56fe255d5fc87.png

    步骤说明:

    1. 小明在一部手机上启动了app。该手机的device_id为x1,此时生成一个dsitinct_id为d1;
    2. 小明在这个手机上用账号u1进行登录。此时device_id为x1,user_id为u1,dsitinct_id为d1;
    3. 小明继续在这手机上使用app。此时device_id为x1,user_id为u1,dsitinct_id为d1;
    4. 小明退出自己的账号,继续使用app。此时仍然device_id为x1,user_id为u1,dsitinct_id为d1;
    5. 小明把手机给了小花,小花用自己的账号u2登录app。此时u2去关联x1,因为x1已经与u1关联,故关联失败。所以重新生成一个distinct_id为d2来标识此用户(u2);
    6. 小花继续使用app。此时device_id为x1,user_id为u2,dsitinct_id为d2;
    7. 小明换了部新手机,使用app。此时device_id为一个新的x2,后台生成一个新的dsitinct_id为d3;
    8. 小明在新手机上,使用账号u1登录了app。此时u1去关联x2,因为x2之前没有与账号关联过,所以关联成功,但是u1已经有一个dsitinct_id为d1,所以此时的dsitinct_id仍然为d1;
    9. 小明继续在新手机上使用app。此时device_id为x2,user_id为u1,dsitinct_id为d1。

    此时三个字段的映射关系为:

    2848b3af29bb6a989b00be4e0f2401bf.png

    (1)后续修复

    事件字段修复

    小明换新手机后,在登录前,系统给分配的dsitinct_id为d3,不符合实际情况,故要将在新手机上登录前的dsitinct_id修复为d1。如下:

    dce67c0d1db578ae3e9e9f3546143bb7.png

    映射表修复

    1)删除d3与x2的映射关系

    2)将x2添加到d1的device_id_list字段

    0ebc32546c75c52438196350a83a7468.png

    本文由 @如琴留音 原创发布于人人都是产品经理。未经许可,禁止转载

    题图来自Unsplash,基于CC0协议

    展开全文
  • 订单唯一标识

    2019-09-25 17:04:34
    在平常开发系统,设计表结构的时候,...java生成唯一标识 版本一 java自带生成唯一标识UUID System.out.println(UUID.randomUUID().toString()); 输出 4880d2b4-bc5f-48d1-ba58-003334276d46 明显地看出来太长了...

    在平常开发系统,设计表结构的时候,常常需要有一个字段来标识该条记录的唯一性,从java层面和数据库层面不同维度来进行实现

    java生成唯一标识

    版本一

    java自带生成唯一标识UUID

    System.out.println(UUID.randomUUID().toString());

    输出

    4880d2b4-bc5f-48d1-ba58-003334276d46

    明显地看出来太长了而且很不友好

    版本二

    进一步处理生成8位UUID

        public String[] chars = new String[]
                {
                        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
                        "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
                };
    
        public String getShortUuid() {
            StringBuffer stringBuffer = new StringBuffer();
            String uuid = UUID.randomUUID().toString().replace("-", "");
            for (int i = 0; i < 8; i  ) {
                String str = uuid.substring(i * 4, i * 4   4);
                int strInteger = Integer.parseInt(str, 16);
                stringBuffer.append(chars[strInteger % 0x3E]);
            }
    
            return stringBuffer.toString();
        }
        @Test
        public void test4(){
            TestDemo2 testDemo2 = new TestDemo2();
            System.out.println(UUID.randomUUID().toString());
            System.out.println(testDemo2.getShortUuid());
        }

    输出

    4880d2b4-bc5f-48d1-ba58-003334276d46
    M3EeoAYr

    版本三

    时间戳加上生成的8位UUID

        @Test
        public void test3() {
            TestDemo2 testDemo2 = new TestDemo2();
            String shortUuid = testDemo2.getShortUuid();
            String create_time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
            System.out.println(create_time shortUuid);
        }

    输出

    20190925101216hh42xxn6

    推荐使用时间戳加上生成的8位UUID

    oracle生成唯一标识

    版本一

    序列号生成唯一标识

    创建序列

    -- Create sequence 
    create sequence SEQ_ORDER_ID
    minvalue 100000
    maxvalue 999999
    start with 414591
    increment by 1
    nocache
    cycle;
    

    字段
    说明
    minvalue
    定义序列生成器能产生的最小值
    maxvalue
    定义序列生成器能产生的最大值
    start with
    定义序列的初始值(即产生的第一个值),默认为1
    increment by 定义序列的步长(增长量),如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的
    nocache
    表示不对序列进行内存缓冲
    cycle
    表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环

    获取序列号

    SELECT SEQ_ORDER_ID.NEXTVAL FROM DUAL;

    输出

    414785
    

    版本二

    时间戳加上序列号

    SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')||SEQ_ORDER_ID.NEXTVAL FROM DUAL;
    

    输出

    20190925102115414805
    

    推荐使用时间戳加上序列号

    展开全文
  • 最近老陈在自己倒腾一些东西,然后其中就用到了一些跟踪技术,以前获取一些用户路径跟踪主要靠的是cookie标识,但是这一种的话并不能解决很大程度上,前端浏览器唯一标识的问题,有这个唯一标识我们就能够针对使用...
    点击 上方蓝字 关注我们10c2cc2fea4145b1fbf307c674b81f49.png

    阅读本文大概需要3分钟。

    最近老陈在自己倒腾一些东西,然后其中就用到了一些跟踪技术,以前获取一些用户路径跟踪主要靠的是cookie标识,但是这一种的话并不能解决很大程度上,前端浏览器唯一标识的问题,有这个唯一标识我们就能够针对使用手机或者pc端上特定的浏览器给他建立一个身份,并且根据这个身份记录一些他的习惯。1.通过canvas来绘制指纹信息由于不同的系统显卡在绘制canvas时渲染的各个参数不同,所以绘制出来的图片的数据的crc校验是不一样的,所以我们可以根据这个来生成浏览器的指纹信息。
    function getId ({  const canvas = document.getElementById('canvas')  const ctx = canvas.getContext('2d')  ctx.font = '16px Arial'  ctx.fillStyle = '#ccc'  ctx.fillText('hello, shanyue', 2, 2)  return canvas.toDataURL('image/jpeg')}
    解读一下代码,获取base64的dataurl,对这个dataurl进行md5计算就可以了。2.使用成熟的第三方库fingerprintjs2主要他会根据以下几种来获取浏览器指纹信息。canvas、webgl、UserAgent、AudioContext、对新式API的支持等。
    requestIdleCallback(function () {  Fingerprint2.get((components) => {    const values = components.map((component) => component.value)    const fp = Fingerprint2.x64hash128(values.join(''), 31)  })})

    components也有一些分类,里面有一些components是稳定的,有一些是不稳定的,所以要根据自己对于业务的理解生成属于自己的唯一标识。

       扫描关注

    老陈说前端

    想象不到的干货

    f32572d45eac66ee4335b8abe6fb9f02.png   
    展开全文
  • Android唯一标识

    千次阅读 2017-08-16 09:47:21
    Android中能作为唯一标识有四个,但付出一定的代价还是还是能改变,所以目前Android中没有绝对的唯一标识。 1、设备Id(IMEI) (需要授予权限) TelephonyManager telephonyManager = (TelephonyManager...
    
    
    Android中能作为唯一标识有四个,但付出一定的代价还是还是能改变,所以目前Android中没有绝对的唯一标识。

    1、设备Id(IMEI) (需要授予权限)
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager != null ? telephonyManager.getDeviceId() : null;


    2、SIM卡有一个ID(用户可能会换手机卡) (IMSI
    SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成
    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager != null ? telephonyManager.getSubscriberId() : null;

    从上面可以发现,无论是获取IMEI还是IMSI,都使用TelephonyManager这个类,通过getSystemService(Context.TELEPHONY_SERVICE)方法获取TelephonyManager实列
    getDeviceId获取IMEI,getSubscriberId获取IMSI
      

    3、Wifi或蓝牙的MAC地址(缺陷:需要权限、且打开蓝牙和WIFI,6.0开始获取不到真实的值
    并且Android6.0开始,为了给用户更多的数据保护,Android 移除了通过 WiFi 和蓝牙 API 来在应用程序中可编程的访问本地硬件标示符。现在 WifiInfo.getMacAddress() 和 BluetoothAdapter.getAddress() 方法都将返回 02:00:00:00:00:00

    展开全文
  • 一、基础知识☞ 接口地址...secret=SECRET&js_code=JSCODE&grant_type=authorization_code☞ 请求参数appid:小程序的唯一标识secret:小程序的app secretjs_code:用户的登录凭证code(...
  • id唯一标识

    2017-04-23 19:24:28
    id是唯一标识,任何一个都不能重名。(即使它们表示同一类东西) 再次用的时候必须换一个id名
  • 4G EPS 中的各种唯一标识

    千次阅读 2019-12-11 15:51:51
    文章目录目录移动电话运营商的唯一标识:PLMN、MCC 与 MNC移动用户的唯一标识:IMSI、MSIN 与 MSISDN/MDN移动用户的唯一临时标识:TMSI、GUTI 与 GUMMEI移动用户定位唯一标示:TAC、TAI 和 TAU 移动电话运营商的唯一...
  • nginx添加唯一标识

    2020-01-15 10:22:42
    HTTP_REQUEST_ID /usr/local/nginx/conf/fastcgi_params 增加唯一标识 fastcgi_param HTTP_REQUEST_ID $request_id;
  • Qt生成唯一标识

    千次阅读 2018-11-29 20:32:49
    利用随机数生成唯一标识 qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); //初始化 int id = qrand(); //生成随机数,即唯一标识 qsrand(QTime(0,0,0).msecsTo(QTime::currentTime())); int id = ...
  • 01为什么要建设用户唯一标识 如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情。因为如果做不到用户的唯一识别,那凡是涉及到用户的数据都将是错的(比如用户量、新增用户数...
  • Fingerprintjs2 是通过纯前端原生js实现的浏览器指纹采集器,通过获取浏览器中所有能获取到的信息(部分通过base64转成String),最后生成出md5,用于该用户在该设备上的唯一标识码,官方宣称准确度高达99.5%测试代码...
  • Redis生成唯一标识

    2019-04-14 14:20:24
    Redis生成唯一标识 代码如下 /**使用redis生成唯一ID Start===============================================*/ private DateFormat df = new SimpleDateFormat("yyyyMMdd"); /** * 起始的时间戳 */ private...
  • Android获取唯一标识

    2020-08-28 15:33:14
    在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬件信息。 Android6.0之前的方法(已过时) DEVICE_ID 通getSystemService...
  • wx.login(OBJECT)调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。...
  • 时间戳与唯一标识

    2019-09-22 07:16:14
    以前没遇到这个问题,一直以为时间戳是可以作为类似于主键一样的唯一标识。直到昨天遇到个老项目,出了个奇怪的bug。 项目是别人做的老项目,我们在修改,昨天测试告知说某输入框,有时候能输入东西,有时候内容会...
  • 设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 原文地址:http://www.vonwei.com/post/UniqueDeviceIDforWindows.html  唯一的标识一个设备是一个基本功能,可以拥有很多应用...
  • C++获取电脑主板唯一标识

    千次阅读 2019-02-11 16:32:04
    获取电脑的唯一标识有很多好处,比如注册、授权等,而且电脑中有很多是唯一标识的硬件,比如网卡、CPU、硬盘、主板等。但是如果电脑中有两个网卡的话,就不知道使用哪个网卡作为唯一的了。可以通过获取主板的ID,...
  • JS前端生成唯一标识

    千次阅读 2019-11-26 11:14:10
    转载 原地址:...js获取guid 在前端得到唯一标识符 var guid = guid(); // 得到的guid为唯一标识 /** *获取id */ function guid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxx...
  • 获取客户端唯一标识

    万次阅读 2017-04-14 11:59:26
    在项目中我们通常会用到手机的唯一标识码传给服务器用于统计用户量什么的,我们有可能使用手机的IMEI或者AndroidID、Mac地址等之类的作为标识,但是这些标识对于有的手机可能获取不到导致唯一标识上传失败,这一类的...
  • 在Android中用来区别应用程序的唯一标识到底是什么,在以前一直以为是清单文件中配置的包名即为应用程序的唯一标识。在以前用Eclipse开发应用程序的时候确实包名即为应用程序的ApplicationId即应用程序的唯一标识。...
  • js生成UUID唯一标识

    2019-04-22 16:27:52
    js生成UUID编码,作为唯一标识 /** * 生成标识 * @returns */ function getUID () { // 获取唯一值 return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Mat...
  • 获取移动设备唯一标识 原文:获取移动设备唯一标识 前段时间开发中 ,客户提出一个问题就是把用户的登录记录和设备绑定到一起,就是每个人都是固定的设备(可能是安全因素吧)。...
  • sql生成唯一标识

    2017-06-07 08:31:00
    1. oracle 生产唯一标识 sys_guid()函数 2 sqlserver newid() 函数 转载于:https://www.cnblogs.com/hzf08/p/6955129.html
  • ABAP 生成唯一标识GUID

    千次阅读 2018-07-30 10:26:23
    ABAP开发中经常需要为某字段(通常是主键或索引)自动生成唯一标识,可以通过GUID实现 备注 GUID全局唯一标识符(Globally Unique Identifier)是UUID(Universally Unique Identifier)的一种实现 ABAP使用方法 ...
  • android手机获取唯一标识

    千次阅读 2017-06-02 09:09:55
    获取手机唯一标识 拼接的方式获取手机唯一标识 第一种方式是获取IMEI,但是有的手机如果不是正品的话,就获取不到所以通过这一种方式还是会出现有的设备是没有唯一标识的 第二种方式获取手机卡的序列号,当然这种...
  • android获取设备唯一标识

    千次阅读 2019-04-30 14:49:06
    我的设备是TV,获取不到IMEI,但是有以太网口,所以最好的办法是获取以太网mac作为唯一标识。 public class MobileInfoUtil { private static String wifiTag = "wlan0";//无线标志,关闭wifi开关后获取不到 ...
  • 各种获取设备唯一标识的方法介绍, 实现获取唯一标识的最好的方法。
  • Android设备的唯一标识

    2016-07-27 11:27:55
    Android设备的唯一标识IMEI权限获取IMEI/** * 获取IMEI * * @return IMEI */ private String getIMEI() { try { TelephonyManager Teleph
  • 文件唯一标识

    千次阅读 2013-12-05 16:27:04
    cocos2dx 很简单的把音效处理封装在SimpleAudioEngine里面,播放文件的时候,创建一个文件唯一标识,当然不是简单的来一个文件就一个index++,因为这样区别不了同一文件的播放! unsigned int _Hash(const char *key...
  • iOS获取手机唯一标识

    2019-03-07 14:46:49
    项目需求,在用户没有登录情况下根据手机标识作为身份认证获取对应信息。...系统提供了获取uuid的方法作为设备唯一标识,但是存在一个缺陷。 根据官方解释 The value of this property is the same for app...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,196
精华内容 13,278
关键字:

唯一标识