Android 如何将GCM注册id唯一存储到MySQL中
我正在设置Google云消息机制的服务器端,使用MySQL存储移动应用程序提供的注册ID。考虑到谷歌最多可以发布4k注册ID,我不得不将它们存储在一个文本字段中。到目前为止一切都很好,问题是我必须处理这样的情况:Android 如何将GCM注册id唯一存储到MySQL中,android,mysql,push-notification,google-cloud-messaging,Android,Mysql,Push Notification,Google Cloud Messaging,我正在设置Google云消息机制的服务器端,使用MySQL存储移动应用程序提供的注册ID。考虑到谷歌最多可以发布4k注册ID,我不得不将它们存储在一个文本字段中。到目前为止一切都很好,问题是我必须处理这样的情况: 用户登录到应用程序 该应用程序向谷歌请求注册id 应用程序将新的注册id发送到应用程序服务器 服务器存储该注册id并将其链接到当前登录的用户 该用户注销,新用户登录 应用程序向服务器发送与以前相同的注册id 服务器必须能够看到注册id已在数据库中,但已链接到其他用户 服务器从以前的用户
- 计算注册id的散列并强制该散列是唯一的,但可能存在冲突
- 我可以将唯一的设备id与注册id一起存储,并强制该设备id是唯一的。我看到的问题是,我不知道android设备id可以使用多长时间,我认为在某些情况下它是不可用的
- 我可以在每次收到新的注册id时执行搜索,但我认为这将导致性能非常差的操作
- 为了存储注册ID本身,最好使用VARBINARY(4096)列。如果使用有效的字符集(如UTF-8)对注册ID进行编码,则比文本更有效
- 为了高效搜索,您应该还有一个附加的索引哈希列(二进制(32))-我们使用
摘要算法从注册ID获取32字节的哈希。哈希列不必是唯一的。冲突应该非常罕见,即使发生冲突,您的查询也会提供少量共享相同哈希的注册ID,因此在Java代码中测试其中哪一个(如果有的话)与您要查找的注册ID实际匹配不会影响性能SHA-256
- 如果您选择存储唯一的设备ID并基于它进行搜索,我建议您为每个设备分配自己的标识符。该标识符可以是(例如)BIGINT(java中的long)。您可以要求应用程序在首次启动时调用服务器以获取唯一标识符。您可以将其存储在设备的外部存储器中,以便卸载并重新安装应用程序的设备仍具有相同的标识符