2016-08-11 4 views
0

Я использую ora_hash, чтобы получить случайный хеш, который выглядит так.PL/SQL установить точную длину случайным ora_hash

SELECT ORA_HASH (userID || SYSTIMESTAMP || SYS_GUID()) AS hash 
FROM DUAL; 

userID является nNumber с 5 цифр. Я проверил это долгое время и заметил, что он генерирует мне число с длиной от 7 до 10 цифр.

Теперь я хотел бы знать, если есть хороший способ, чтобы создать хэш, который всегда содержит 10 цифр, означает число между 1000000000 и 9999999999.

Или я должен взять на себя differenct от длины к номер 10 и вычислить его? Каков наилучший способ

+0

Я считаю, что максимальное значение, которое будет выдано 'ORA_HASH()', составляет '4294967295', что составляет десять цифр и меньше, чем' 9999999999'. См. [Документация] (https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions097.htm) здесь. –

+0

Я вижу, '9999999999' был всего лишь номером для показа диапазона. Моя цель - создать хэш, который содержит всегда 10 цифр. – Ovoxo

+0

Я не уверен, что это можно сделать, используя только функцию. Можно установить max, но минимум неявно равен нулю. –

ответ

1

Ну, вы также можете изменить свой запрос и получить 10-значный результат. Может быть, вы можете использовать, как показано ниже:

select case when length(hash_val)> 10 then 
      substr(hash_val,1,10) 
      when length(hash_val) < 10 then 
      lpad(hash_val,10,abs(dbms_random.random)) 
      else 
      to_char(hash_val) 
     end   
from (  
SELECT ORA_HASH ('00000' || SYSTIMESTAMP || SYS_GUID()) AS hash_val 
FROM DUAL); 
+0

Это похоже на то, что я искал. Только одна вещь. так как вы добавили dbms_random.random Он генерирует мне отрицательное число иногда – Ovoxo

+0

Я добавил ABS, а также всегда будет давать положительный результат – XING

0
SELECT 1000000000+ORA_HASH (userID || SYSTIMESTAMP || SYS_GUID()) AS hash 
FROM DUAL; 

должен сделать трюк (не будет идти до 9999999999, хотя, так как ora_hash идет только до 4294967295, так +1000000000 делает 5294967295 по большей части)

Смежные вопросы