【发布时间】: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