【问题标题】:SQL: Cross-platform generation of N-digit unique identifier (SQL Server, Snowflake, etc.)SQL:跨平台生成N位唯一标识符(SQL Server、Snowflake等)
【发布时间】:2021-12-13 01:30:32
【问题描述】:

我们在两个不同的平台上拥有两个数据库/仓库——Microsoft SQL Server 和 Snowflake(云数据仓库)。

在两者中,客户通过唯一的AccountId(整数)和Uuid(32 个字符)来识别。

对于特定用例,我们需要获取这些唯一值之一(例如,AccountId),将其传递给系统函数,并生成唯一的 20 字符标识符(不能长/短)。

这个函数需要在两个系统中都存在。 (例如select sys.myfn(1234) 在每个中返回相同)

我知道 Snowflake 有类似sha1():https://docs.snowflake.com/en/sql-reference/functions/sha1.html的功能

相当于 SQL Server 中的HASHBYTES()https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-ver15

如何获取其中一个的输出并将其截断为 20 个字符并保持唯一性?

【问题讨论】:

  • 您不能截断散列值并期望它仍然是唯一的。您可以做到这一点的唯一方法是提出自己的算法,该算法适用于 Snowflake 和 SQL Server 并保证其唯一性。标识符必须为 20 个字符是否有原因?
  • 如果您有唯一的 AccountId,则根本不需要使用 UUID。您可以简单地在 AccountId 上留下填充零以达到 20 位吗?
  • 为什么需要截断任何内容?散列算法产生一致大小的输出。当将输出保存为二进制而不是字符时,字节长度本身是有效的。正如上面的 cmets 建议的那样,如果您尝试截断任何内容,您将失去这些散列算法著名的功能:唯一性。
  • @MikeWalton 必须是 20 个字符,因为输出最终会以 .gov 机构结束,他们只会接受该长度。
  • @GregPavlik 我只考虑了左填充,但上游 mgmt 不想以任何方式公开数字帐户 ID

标签: sql sql-server sql-server-2008 snowflake-cloud-data-platform


【解决方案1】:

UUID 是一个 128 位的值(保留一些位用于版本信息)。如果您通过哈希函数运行它,对哈希执行 base64 编码,然后截断为 20 个字符,您仍然会得到 20 * 6 = 120 位的范围。碰撞的可能性仍然存在于宇宙中。

(注意:如果您选择直接对 UUID 进行 base64 编码,截断可能会导致顺序分配的 UUID 发生冲突。)

整数值可以类似地编码,与基于 UUID 的值发生冲突的可能性很小。

如果您可以在两个平台上找到等效的可用 base64 wncoding 实现,我认为您将找到解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2015-11-23
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多