Хеш числа в Oracle - PullRequest
       1

Хеш числа в Oracle

0 голосов
/ 08 марта 2019

У меня есть столбец в таблице

table1

user_id
123456
123457
123458
123459
123460

Мне нужно генерировать безопасные и односторонние хэшированные значения, состоящие из 12 цифр, непоследовательные, без непрерывных нулей в числе. Хэшированное значение не должно перекрываться (означает уникальное) и должно быть ТОЛЬКО ЧИСЛЕННЫМ. Что-то вроде:

table1

user_id     updated_user_id
123456      356456456345
123457      312412012412
123458      340475434545
123459      355344356461
123460      576898973434

Мне известно о ORA_HASH, однако он выводит не более 10 цифр, и мне хотелось бы 12 цифр.

Есть ли способ в Oracle SQL, чтобы достичь этого?

Ответы [ 4 ]

2 голосов
/ 08 марта 2019

Я был бы осторожен с добавлением хеш-значений. Это может повлиять на столкновения. Итак:

UPDATE TABLE1
    SET updated_user_id = (ORA_HASH(user_id, 1000000000, 0) - 1) * 1000 +
                           ORA_HASH(user_id, 1000, 1) - 1;

Вы должны понимать, что хеш-значения могут иметь коллизии. Таким образом, это не на 100% уверен, что результаты будут уникальными. Если важна гарантированная уникальность, вы можете объединить хеш с некоторыми манипуляциями с идентификатором пользователя - арифметическими или побитовыми операциями.

1 голос
/ 08 марта 2019
UPDATE TABLE1
    SET updated_user_id = 
    (
        ORA_HASH(user_id, 999999999, 0) * 1000 +
        ORA_HASH(user_id, 999999999, 1)
    );

Поскольку обе хеш-функции используют разные начальные числа, 0 и 1, это должно соответствовать вашим требованиям.

0 голосов
/ 08 марта 2019

Вы говорите о безопасности.Итак, давайте посмотрим, что мы можем прочитать из идентификаторов ...

Допустим, мы знаем, что существуют идентификаторы пользователей 123456 и 123460.Тогда мы можем предположить следующее:

  1. Идентификаторы пользователя 123457, 123458 и 123459 также существуют.Однако мы не знаем, являются ли эти пользователи активными или нет.
  2. Пользователь 123457 был введен после пользователя 123456 и до пользователя 123458.

Я думаю, что именно об этом.Мы извлекли все секреты, которые нас так сильно интересовали.

Если это так, тогда вы можете применить какой-нибудь глупый алгоритм.Вот несколько сгенерированных идентификаторов пользователя:

118233146610
414263244517
517233547579
618263344516
919293149578

12-значные числа.Чтобы увидеть исходные числа, посмотрите на каждую другую цифру: 118233146610 становится 123460. Поэтому для генерации чисел возьмите несколько случайных цифр и используйте манипуляции со строками для их вставки.И, в отличие от хэш-чисел, дубликатов быть не может.

0 голосов
/ 08 марта 2019

Добавьте 110000000000 к каждому ORA_HASH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...