如何在 IBM Netezza 上创建具有超过 64 位熵的人类可读标识符?

How to create human-readable identifier with more than 64 bits of entropy on IBM Netezza?

我在 IBM Netezza/PureData 工作,我想在 table 中添加一个标识符列,每天包含数十亿条新记录,这样我就可以跟踪每条记录 旅行 通过不同的 table 和系统。我希望此标识符具有超过 64 位的熵,因为该列可能(及时)包含超过 10^12 条不同的记录,并且我想避免散列冲突。根据 this table,64 位不足以避免与此数量的记录发生哈希冲突。

位数不足

所以,在 Netezza 上我可以轻松做到

select hash8(123456) as id

这将 return 一个 64 位数字 (BIGINT):

-1789169473613552245

这是完全可读的,但它只有 64 位的熵。

人类无法阅读

我也可以:

select hash(123456) as id

在 Netezza 上创建 128 位散列。这有足够的熵,但它变成了一堆不可读的 unicode 字符:

oð8^GþåíOpJ

恐怕这会在我开始将此日期与其他系统的 table 合并时造成麻烦。

足够的位和人类可读的?

因此,我想创建一个人类可读的标识符,例如,将这个 128 位 unicode 字符串转换为 base-62 字符串,仅包含字母数字字符(0-9、a-z、A-Z) .类似于:

6KMPOATg6Y5TbuEZlD59Dp

关于如何做到这一点有什么想法吗?理想情况下仅使用 (Netezza) SQL-代码或函数...

MS SQL 在 XML 数据类型中支持 base-64。

declare @source varbinary(max), @encoded varchar(max), @decoded varbinary(max)
set @source = convert(varbinary(max), 'Hello Base64')
set @encoded = cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)')
set @decoded = cast('' as xml).value('xs:base64Binary(sql:variable("@encoded"))', 'varbinary(max)')
select
convert(varchar(max), @source) as source_varchar,
@source as source_binary,
@encoded as encoded,
@decoded as decoded_binary,
convert(varchar(max), @decoded) as decoded_varchar

来自http://blog.falafel.com/t-sql-easy-base64-encoding-and-decoding/

由于您似乎有可用的 SQL 扩展(hash() 是 Netezza SQL 扩展函数之一),您可以尝试对您的输出执行 'rawtohex()'散列()

例如

select rawtohex(hash(123456));

这给出了散列数据的一个很好的十六进制字符串表示:

'E10ADC3949BA59ABBE56E057F20F883E'