您可以在Postgres中重新排列字符串吗?

时间:2019-03-04 19:21:10

标签: postgresql

我正在寻找一种在Postgres中重新排列字符串的方法。我需要使字符串不可识别,但它也必须是可逆的,这样哈希函数就消失了,随机生成的任何东西也是如此。另外,我正在使用10个字符长的字符串,因此我想将生成的重新排列的字符串保留在相同的范围内。这不是一个安全的字符串,只是为了保持某种形式可以立即识别。

我想根据...创建一些东西。

Select rearrange('12345abcde');

会产生这样的东西...

'1a2b3c4d5e'

重新排列功能不必完全相同,如果我的方向正确,我可以根据我的特定需求调整功能,但是长度可以变化,并且由于我需要能够颠倒程序,则需要使用非随机方法完成。

1 个答案:

答案 0 :(得分:2)

示例功能

mysql> show index from event_tags_map;
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table          | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| event_tags_map |          0 | PRIMARY  |            1 | eventId     | A         |      302032 |     NULL | NULL   |      | BTREE      |         |               |
| event_tags_map |          0 | PRIMARY  |            2 | tagId       | A         |      604065 |     NULL | NULL   |      | BTREE      |         |               |
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.02 sec)

您可以使用2作为第二个参数来反转十个字符的字符串的转换:

create or replace function rearrange(str text, n int)
returns text language sql immutable as $$
    select string_agg(item, '' order by (ord- 1) % n, ord)
    from regexp_split_to_table(str, '') with ordinality as a(item, ord)
$$;

select rearrange('12345abcde', 5);

 rearrange  
------------
 1a2b3c4d5e
(1 row)