如何在 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'
我在 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'