Twitter开发者账号申请被拒【推特开发者文档系列6】——Twitter IDs(snowflake)

文章转自:https://www.jianshu.com/p/c199f8767d19

本系列是对推特开发者文档进行的翻译,以便帮助开发人员使用API接口,难免有些地方存在不足,还请谅解。


关于如何获得一个推特开发者账号请看此贴:

推特开发者账号的申请

搜索微信公众号 推特开发者 获得帮助


什么是Snowflake?

Snowflake是一种服务,用于为Twitter中的对象(Tweets、Direct Messages、Users、Collections、list等)生成唯一的id。这些id是唯一的64位无符号整数,它们基于时间,而不是顺序的。完整的ID由时间戳、工作编号和序列号组成。在使用JSON使用API时,始终使用字段id_str而不是id是很重要的。这是由于使用JSON的Javascript和其他语言计算大整数的方式所致。如果您遇到一个不符合id和id_str的场景,那是因为您的环境已经解析了id整数,并在过程中修改了数字。请阅读下面的内容,了解更多关于Twitter如何生成id的信息。

问题

一些编程语言(如Javascript)不能支持大于53位的数字。这可以通过在浏览器控制台中运行类似于:(90071992547409921).toString()的命令或通过JSON解析器试运行以下JSON片段。
{"id": 10765432100123456789, "id_str": "10765432100123456789"}
在受影响的JSON解析器中,ID将不会成功转换,并且会失去准确性。 在某些解析器中,甚至可能会有例外。

解决方案

为了允许Javascript和JSON解析器读取ID,Twitter对象在使用JSON响应时包含任何ID的字符串版本。因此,Twitter API中的Status、User、Direct Message、Saved Search和其他id在JSON响应中既作为整数又作为字符串返回。

例如,status对象包含一个id和一个id_str。status对象的以下JSON表示显示了每个数据的id字段的两个版本。

在这里插入图片描述

 

在这里插入图片描述

可以看到既有id也有id_str

开发人员需要做什么

首先要做的是尝试使用解释器对上面的JSON代码片段进行解码。 观察输出以确认ID没有丢失准确性。

  • 如果您的代码成功地转换了ID而没有失去准确性,您可以接受,但是应该考虑尽快转换为IDs的str版本。

  • 如果代码失去准确性,请将代码转换为使用str版本。如果不这样做,代码将无法可靠地与Twitter API交互。

  • 在某些解释器中,JSON在读取ID值时可能抛出异常。如果在解释器中发生这种情况,您将需要“预分析”数据,删除或用它们的str版本替换ID参数。

总结

1.如果您使用Javascript开发,请知道您将必须更新代码以读取字符串版本而不是整数版本。
2.如果使用JSON解码器,请验证上面的示例JSON是否在不引发异常的情况下解码。如果抛出异常,则需要预分析数据。




链接:https://www.jianshu.com/p/c199f8767d19
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TwitterSnowflake 算法是一种生成唯一 ID 的算法,它可以生成更加复杂的 ID,以避免重复。Snowflake 算法的核心思想是,使用一个 64 位的整数作为 ID,其中,高 41 位表示时间戳,中间 10 位表示机器 ID,低 13 位表示序列号。这样,就可以在多台机器上生成不同的 ID,而且在同一台机器上也可以生成不同的 ID。 具体来说,Snowflake 算法的实现主要包括三个部分: 1. 时间戳:使用当前时间戳减去一个固定的起始时间戳,得到一个相对时间戳。由于使用的是相对时间戳,所以即使系统时间被修改,也不会影响生成的 ID。 2. 机器 ID:使用一个固定的机器 ID,可以是 IP 地址或者其他标识符,来标识不同的机器。由于使用的是 10 位二进制数,所以最多可以标识 1024 台机器。 3. 序列号:由于在同一毫秒内,可能会生成多个 ID,因此需要使用一个序列号来标识不同的 ID。由于使用的是 13 位二进制数,所以最多可以生成 4096 个不同的 ID。 使用 Snowflake 算法生成 ID 的代码如下: ```java public class SnowflakeIdGenerator { private static final long START_TIMESTAMP = 1480166465631L; private static final long MACHINE_ID_BITS = 10L; private static final long SEQUENCE_BITS = 13L; private static final long MAX_MACHINE_ID = -1L ^ (-1L << MACHINE_ID_BITS); private static final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BITS); private static final long MACHINE_ID_SHIFT = SEQUENCE_BITS; private static final long TIMESTAMP_SHIFT = MACHINE_ID_BITS + SEQUENCE_BITS; private static final SnowflakeIdGenerator INSTANCE = new SnowflakeIdGenerator(); private long machineId; private long sequence = 0L; private long lastTimestamp = -1L; public static SnowflakeIdGenerator getInstance() { return INSTANCE; } private SnowflakeIdGenerator() { this.machineId = getMachineId(); } private long getMachineId() { // TODO: 获取机器 ID 的方式,可以是 IP 地址或者其他标识符 return 0L; } public synchronized long generateId() { long timestamp = System.currentTimeMillis(); if (timestamp < lastTimestamp) { throw new RuntimeException("Clock moved backwards. Refusing to generate id"); } if (lastTimestamp == timestamp) { sequence = (sequence + 1) & MAX_SEQUENCE; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (machineId << MACHINE_ID_SHIFT) | sequence; } private long tilNextMillis(long lastTimestamp) { long timestamp = System.currentTimeMillis(); while (timestamp <= lastTimestamp) { timestamp = System.currentTimeMillis(); } return timestamp; } } ``` 在使用 Snowflake 算法生成 ID 的时候,需要注意以下几点: 1. 在同一毫秒内,可能会生成多个 ID,因此需要使用一个序列号来标识不同的 ID。由于序列号只有 13 位,所以在高并发的情况下,可能会出现序列号用尽的情况。如果出现这种情况,可以等待下一毫秒,或者使用其他的解决方案。 2. 在使用 Snowflake 算法生成 ID 的时候,每台机器的机器 ID 需要是唯一的。可以使用 IP 地址或者其他标识符来标识不同的机器。如果机器 ID 重复了,可能会生成相同的 ID。 3. Snowflake 算法生成的 ID 是一个 64 位的整数,可以使用字符串来表示。如果需要使用字符串来表示 ID,可以使用 `Long.toString()` 或者其他的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值