为萌百编写的B站和N站数据采集节点的更新日志

之前的就懒得再写了2333

最后更新于2021/08/12 13:29

节点列表

现有的B站数据采集节点
提供商类型地域数量
百度云云服务器广州1(不计自机)
阿里云函数计算(serverless)深圳、成都、杭州、上海、青岛每个地域各1个,共5个
腾讯云云函数(serverless)广州、上海、北京、成都每个地域各5个,共20个
现有的N站数据采集节点
提供商类型地域数量
腾讯云云函数(serverless)香港、首尔每个地域各5个,共10个

节点更新日志

2021/08/06 14:00

  • 因访问超时过多,已移除阿里云函数计算北京节点。

2021/08/09 16:00

  • 因访问超时过多,已移除阿里云函数计算张家口节点。

通用唯一标识符 (UUID) URN 命名空间 – rfc4122

rfc4122

Network Working Group
Request for Comments: 4122
Category: Standards Track
P. Leach
Microsoft
M. Mealling
Refactored Networks, LLC
R. Salz
DataPower Technology, Inc.
July 2005

通用唯一标识符 (UUID) URN 命名空间 – rfc4122

本备忘录的状态

本文档为 Internet 社区指定了 Internet 标准跟踪协议,并请求讨论和改进建议。本协议的标准化状态和现状请参考当前版本的《互联网官方协议标准》(STD 1)。本备忘录的分发不受限制。

版权声明

版权所有 (C) 互联网协会 (2005)

摘要

本规范为 UUID(Universally Unique IDentifier)定义了统一资源名称命名空间,UUID 也称为 GUID(Globally Unique IDentifier)。UUID 的长度为 128 位,可以保证跨空间和时间的唯一性。UUID 最初用于 Apollo 网络计算系统,后来用于开放软件基金会 (OSF) 的分布式计算环境 (DCE),然后用于 Microsoft Windows 平台。

该规范源自 DCE 规范,并获得 OSF(现称为 The Open Group)的许可。

来自 DCE 规范早期版本的信息已合并到本文档中。

介绍

本规范为 UUID(Universally Unique IDentifier)定义了统一资源名称命名空间,UUID 也称为 GUID(Globally Unique IDentifier)。UUID 长 128 位,不需要中央注册过程。

此处的信息旨在为希望使用 UUID 作为 URN 实施服务的人员提供简明指南。本文档中的任何内容均不应被解释为覆盖定义 UUID 的 DCE 标准。

ITU-T 建议书和 ISO/IEC 标准 [3] 源自本文档的早期版本。两组规范已调整一致,并且在技术上完全兼容。此外,ITU-T电信标准化局正在提供全球注册功能;有关详细信息,请参见 https://www.itu.int/en/ITU-T/asn1/Pages/UUID/uuids.aspx

动机

使用 UUID 的主要原因之一是不需要集中授权来管理它们(尽管有一种格式使用 IEEE 802 节点标识符,但其他格式不使用)。因此,按需生成可以完全自动化,并用于各种目的。如果需要,这里描述的 UUID 生成算法支持每台机器每秒高达 1000 万的非常高的分配率,因此它们甚至可以用作事务 ID。

UUID 具有固定大小(128 位),与其他替代方案相比相当小。这非常适合所有类型的排序、排序和散列,在数据库中存储,简单的分配和为一般编程提供方便。

由于 UUID 是唯一且持久的,因此它们是极好的统一资源名称。无需注册过程即可生成新 UUID 的独特能力使 UUID 成为生成成本最低的 UUID 之一。

命名空间注册模板

命名空间 ID:
UUID
注册信息
注册日期:2003-10-01
命名空间的声明注册人:
JTC 1/SC6 (ASN.1 Rapporteur Group)
语法结构声明:

UUID 是一个相对于所有 UUID 的范畴而言在空间和时间上都是唯一的标识符。由于 UUID 是固定大小并包含时间字段,因此值可能会翻转(大约在公元 3400 年左右,取决于所使用的特定算法)。UUID 可用于多种用途,从标记生命周期极短的对象到可靠地识别网络中非常持久的对象。

UUID 的内部表示是内存中的特定位序列,如第 4 节所述。为了准确地将 UUID 表示为 URN,有必要将位序列转换为字符串表示。

每个字段都被视为一个整数,并将其值打印为一个以零填充的十六进制数字字符串,最高有效数字在前。十六进制值“a”到“f”作为小写字符输出,输入时不区分大小写。

UUID 字符串表示的正式定义为以下 ABNF [7] 格式:

UUID                   = time-low "-" time-mid "-"
                             time-high-and-version "-"
                             clock-seq-and-reserved
                             clock-seq-low "-" node
    time-low               = 4hexOctet
    time-mid               = 2hexOctet
    time-high-and-version  = 2hexOctet
    clock-seq-and-reserved = hexOctet
    clock-seq-low          = hexOctet
    node                   = 6hexOctet
    hexOctet               = hexDigit hexDigit
    hexDigit =
      "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
      "a" / "b" / "c" / "d" / "e" / "f" /
      "A" / "B" / "C" / "D" / "E" / "F"

以下是 UUID 作为 URN 的字符串表示的示例:

urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

相关辅助文件:
[1][2]
标识符唯一性注意事项:

本文档指定了三种生成 UUID 的算法:第一种利用 802 MAC 地址的唯一值来保证唯一性,第二种使用伪随机数生成器,第三种使用加密散列和应用程序提供的文本字符串。由此,根据此处的机制生成的 UUID 将可以与已分配或将要分配的所有其他 UUID 保持不同。

标识符持久性注意事项:

UUID 本质上很难在全局意义上被解析。

这一点,再加上 UUID 在其空间上下文中在时间上是唯一的这一事实,确保 UUID 将尽可能保持持久性。

标识符分配过程:

生成 UUID 不需要联系注册机构。有一种算法要求每个生成器在空间上具有唯一值。此值通常是 IEEE 802 MAC 地址,通常已在网络连接的主机上可用。

该地址可以从从 IEEE 注册机构获得的地址块中分配。如果没有这样的地址可用,或者隐私问题使其不适合使用,第 4.5 节指定了两种替代方法。另一种方法是使用如下定义的版本 3 或版本 4 UUID。

标识符解析过程:

由于 UUID 不可全局解析,因此解析过程不适用。

词汇等价规则:

将 UUID 的每个字段视为一个无符号整数,如第 4.1.2 节中的表格所示。然后,要比较一对 UUID,请按照重要性和数据类型对每个 UUID 中的相应字段进行算术比较。

当且仅当所有对应的字段都相等时,两个 UUID 才相等。

作为实现注释:可以通过执行适当的字节顺序规范化在许多系统上执行相等比较,然后将两个 UUID 视为 128 位无符号整数。

本文档中定义的 UUID 也可以按字典顺序排列。对于一对 UUID,如果它们间的不同之处中最重要的字段是第一个 UUID 更大,则第一个在第二个之前。如果这个最重要字段是第二个 UUID 更大,则第二个在第一个之前。

与 URN 语法兼容:

UUID 的字符串表示与 URN 语法完全兼容。从面向位的 UUID 内存表示转换为 URN 时,必须注意严格遵守字符串表示部分中提到的字节顺序问题。

验证机制:

除了确定 UUID 的时间戳部分是否在未来并且因此尚未分配的方法之外,没有用于确定 UUID 是否“有效”的机制。

范围:

UUID 是全局范围的。

ECMAScript中的加法

JS里的+

约定:asd为字面量,asd 为参数和变量,asd() 为执行该块代码。

函数:ToString

参数:argument

  1. 如果参数 argument 的类型为 Undefined,则返回 "undefined"
  2. 否则如果参数 argument 的类型为 Null,则返回 Null
  3. 否则如果参数 argument 的类型为布尔值,则:
    1. 如果参数 argumenttrue,则返回 "true"
    2. 如果参数 argumentfalse,则返回 "false"
  4. 否则如果参数 argument 的类型为数字,则返回 Number.prototype.toString.bind(argument)() 的执行结果;
  5. 否则如果参数 argument 的类型为字符串,则返回 argument
  6. 否则如果参数 argument 的类型为 Symbol,则抛出一个类型错误;
  7. 否则如果参数 argument 的类型为 BigInt,则返回 BigInt.prototype.toString.bind(argument)() 的执行结果;
  8. 否则如果参数 argument 的类型为对象,则:
    1. 令变量 primValueToPrimitive(argument, "string") 的执行结果;
    2. 返回 函数:ToString(primValue) 的执行结果。

函数:ToNumber

参数:argument

  1. 如果参数 argument 的类型为 Undefined,则返回 NaN
  2. 否则如果参数 argument 的类型为 Null,则返回 +0
  3. 否则如果参数 argument 的类型为布尔值,则:
    1. 如果参数 argumenttrue,则返回 1
    2. 如果参数 argumentfalse,则返回 0
  4. 否则如果参数 argument 的类型为数字,则返回 argument
  5. 否则如果参数 argument 的类型为字符串,则:
    1. 令变量 StringNumericLiteral 为参数 argument 去除前后的空格和换行符的结果;
    2. 如果变量 StringNumericLiteral 开头为 "-",则令参数 negativeSigntrue,否则为 false;令变量 StrUnsignedDecimalLiteral 为变量 StringNumericLiteral 去除开头的 "-"后的结果(不论是否有该符号);
    3. 如果变量 StrUnsignedDecimalLiteral"Infinity"(区分大小写),则:
      1. 若参数 negativeSigntrue,则返回 -Infinity;:
      2. 若参数 negativeSignfalse,则返回 +Infinity
    4. 如果变量 StrUnsignedDecimalLiteral 符合正则表达式 /^(\d+(?:\.\d+)?)\.?e(\d+)$/,则:
      1. 若参数 negativeSigntrue,则返回 -1 * $1 * Math.pow(10, $2)的执行结果;
      2. 若参数 negativeSignfalse,则返回 1 * $1 * Math.pow(10, $2)的执行结果;
    5. 如果变量 StrUnsignedDecimalLiteral 符合正则表达式 /^(\d+(?:\.\d+)?)$/,则:
      1. 若参数 negativeSigntrue,则返回 -1 * $1的执行结果;
      2. 若参数 negativeSignfalse,则返回 1 * $1
    6. (后面的实在是太复杂了,还有二进制、八进制、十六进制,自行看ECMA262#sec-literals-numeric-literals)8。
  6. 否则如果参数 argument 的类型为 Symbol,则抛出一个类型错误;
  7. 否则如果参数 argument 的类型为 BigInt,则抛出一个类型错误;
  8. 否则如果参数 argument 的类型为对象,则:
    1. 令变量 primValueToPrimitive(argument, "number") 的执行结果;
    2. 返回 函数:ToNumber(primValue) 的执行结果。

函数:ToNumeric

参数:value

  1. 令变量 primValueToPrimitive(argument, "number") 的执行结果;
  2. 如果变量 primValue 的类型为 BigInt,则返回变量 primValue 并终止运行;
  3. 返回函数 ToNumber(primValue) 的执行结果。

函数:OrdinaryToPrimitive

参数: O, hint

  1. 如果参数 O 不是对象,则抛出错误;
  2. 如果参数 hint 不是"string""number"则抛出错误;
  3. 如果参数 hint"string",则令变量 methodNames["toString", "valueOf"];如果参数 hint"number",则令变量 methodNames["valueOf", "toString"]
  4. 对变量 methodNames ,循环取成员 name
    1. 如果变量 O 存在名为变量 name 的值的方法,则:
      1. 令变量 result 为执行 O.name() 的结果;
      2. 如果变量 result 的类型不为对象,则返回result并终止运行。
  5. 抛出一个类型错误。

函数:ToPrimitive

参数: input, preferredType

  1. 如果参数 input 不属于ECMAScript语言标准定义的7种类型(undefinednull、布尔值、字符串、Symbol、数字、对象),则抛出错误;
  2. 如果参数 input 的类型为对象,则:
    1. 令变量 exoticToPrim 为参数 input 的名为变量 Symbol.toPrimitive 的方法;
    2. 如果变量 exoticToPrim 不为undefined,则:
      1. 如果参数 preferredType 没有设置,则令变量 hint"default"
      2. 否则如果参数 preferredType"string",则令变量 hint"string"
      3. 否则:
        1. 如果参数 preferredType 不为"number",则抛出错误;
        2. 否则令变量 hint"number"
      4. 令变量 resultinput.exoticToPrim(hint) 的结果;
      5. 如果变量 result 的类型不为对象,返回变量 result 并终止执行;
      6. 抛出一个类型错误。
    3. 如果参数 preferredType 未设置,令参数 preferredType 为"number";
    4. 返回 OrdinaryToPrimitive(input, preferredType) 的执行结果。

+

我们约定 + 左边的变量为 lval,而右边的为 rval

  1. 令变量 lprimToPrimitive.(lval) 的执行结果;
  2. 令变量 rprimToPrimitive.(rval) 的执行结果;
  3. 如果变量 lprim 的类型为字符串,变量 rprim 的类型为字符串,则:
    1. 令变量 lstrToString.(lprim) 的执行结果;
    2. 令变量 rstrToString.(rprim) 的执行结果;
    3. 返回将变量 lstr 和变量 rstr 组合后的字符串。
  4. 注意:此时 + 操作一定是数字型操作;
  5. 令变量 lnumToNumeric.(lval) 的执行结果;
  6. 令变量 rnumToNumeric.(rval) 的执行结果;
  7. 如果变量 lprim 的类型与变量 rprim 的类型不一致,则抛出类型错误;
  8. 如果变量 lprim 的类型为数字,则:
    1. 如果变量 lprimNaN 或变量 rprimNaN,返回 NaN
    2. 如果变量 lprim+Infinity 且变量 rprim-Infinity,返回 NaN
    3. 如果变量 lprim-Infinity 且变量 rprim+Infinity,返回 NaN
    4. 如果变量 lprim+Infinity 或变量 lprim-Infinity,返回 lprim
    5. 如果变量 rprim+Infinity 或变量 rprim-Infinity,返回 rprim
    6. 如果变量 lprim-0 且变量 rprim-0,返回 -0
    7. 返回变量 lprim 和变量 rprim 相加的值。
  9. 如果变量 lprim 的类型为 BigInt,则返回变量 lprim 和变量 rprim 相加的值。