我在表格中有一列
表1
user_id
123456
123457
123458
123459
123460
我需要生成安全的1路散列值,该值是12位数字,非顺序的,数字中没有连续的零。散列值不应重叠(意味着唯一),并且只能是数字。像这样:
表1
user_id updated_user_id
123456 356456456345
123457 312412012412
123458 340475434545
123459 355344356461
123460 576898973434
我知道ORA_HASH
,但是它最多只能输出10位数字,而我希望输出12位数字。
Oracle SQL中是否有一种方法可以实现这一目标?
答案 0 :(得分:2)
添加哈希值时我会小心。这会影响碰撞。所以:
UPDATE TABLE1
SET updated_user_id = (ORA_HASH(user_id, 1000000000, 0) - 1) * 1000 +
ORA_HASH(user_id, 1000, 1) - 1;
您应该意识到哈希值可能会发生冲突。因此,这不能100%保证结果是唯一的。如果保证唯一性很重要,则可能需要将哈希与用户ID的某些操作(算术或按位运算)结合起来。
答案 1 :(得分:1)
UPDATE TABLE1
SET updated_user_id =
(
ORA_HASH(user_id, 999999999, 0) * 1000 +
ORA_HASH(user_id, 999999999, 1)
);
由于两个哈希函数使用不同的种子(0和1),因此应满足您的要求。
答案 2 :(得分:0)
您正在谈论安全性。那么,让我们看看我们可以从ID中读取什么...
比方说,我们知道用户ID 123456和123460存在。然后我们可以推测以下内容:
我想就是这样。我们已经提取了我们非常好奇的所有秘密。
就是这样,那么您可以应用一些愚蠢的算法。这是一些生成的用户ID:
118233146610 414263244517 517233547579 618263344516 919293149578
12位数字。要查看原始数字,请查看其他所有数字:118233146610变为123460。因此,为了生成数字,请获取一些随机数字并使用字符串操作将其插入。而且与哈希数不同,不能有重复项。
答案 3 :(得分:-2)
向每个ORA_HASH添加110000000000。