Oracle中的哈希数

时间:2019-03-08 08:11:21

标签: sql oracle

我在表格中有一列

表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中是否有一种方法可以实现这一目标?

4 个答案:

答案 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存在。然后我们可以推测以下内容:

  1. 用户ID 123457、123458和123459也存在。但是,我们不知道这些用户是否仍处于活动状态。
  2. 在用户123456之后和用户123458之前输入了用户123457。

我想就是这样。我们已经提取了我们非常好奇的所有秘密。

就是这样,那么您可以应用一些愚蠢的算法。这是一些生成的用户ID:

118233146610
414263244517
517233547579
618263344516
919293149578

12位数字。要查看原始数字,请查看其他所有数字:118233146610变为123460。因此,为了生成数字,请获取一些随机数字并使用字符串操作将其插入。而且与哈希数不同,不能有重复项。

答案 3 :(得分:-2)

向每个ORA_HASH添加110000000000。