相关疑难解决方法(0)

混淆ID

我正在寻找一种方法来将整数ID加密/混淆为另一个整数.更准确地说,我需要一个功能int F(int x),所以

  • x < - > F(x)是一一对应的(如果x!= y,F(x)!= F(y))
  • 给定F(x),很容易找出x - 所以F不是哈希函数
  • 给定x和F(x)很难/不可能找到F(y),类似的东西x ^ 0x1234不起作用

为清楚起见,我不是在寻找强大的加密解决方案,它只是混淆.想象一下,像URL的Web应用程序example.com/profile/1,example.com/profile/2等型材本身并不是秘密,但我想,以防止随意偷窥查看/读取所有配置了一个又一个,所以我宁愿躲在他们身后像example.com/profile/23423,example.com/profile/80980234等等.虽然数据库存储的令牌可以很容易地完成工作,我很好奇是否有一些简单的数学可用于此.

我不清楚的一个重要要求是结果看起来应该是"随机的",也就是说,给定一个序列x,x+1,...,x+n,F(x),F(x+1)...F(x+n)不应该形成任何类型的进展.

encryption algorithm

81
推荐指数
5
解决办法
2万
查看次数

找到无碰撞随机数的有效方法

我有一个用户表,用户ID是公共的.但是我想混淆注册用户的数量和项目的趋势,所以我不希望公共递增ID.

创建新用户时,我想找到一个大于某个数字但尚未存在于数据库中的随机整数.

天真的代码:

<?php
    $found = false;
    while(!$found) {
      $uid = rand(1000000000,4294967295) // find random number betwen minimum and maximum
      $dbh->beginTransaction();
      // check if user id is in use, and if not insert it
      if($dbh->query("SELECT * FROM users WHERE uid = $uid")) {
        $dbh->exec("INSERT INTO users (uid) VALUES ($uid)");
        $found = true;
      }
      $dbh->commit();
    }
    // we just got our new uid ...
?>
Run Code Online (Sandbox Code Playgroud)

这将起作用,但可能会变得低效.确实有一个很大的范围,击中未使用的uid的可能性很高.但是,如果我想使用较小的范围,因为我不想拥有这么长的用户名怎么办?

我担心的例子:

  • 所有用户ID的60%正在使用中
  • 击中未使用的uid的几率为0.4
  • 第一次尝试的成功率为0.4%
  • 如果第一次没有成功,第二次尝试的概率为0.6*0.4
  • 所以最多两次尝试我有0.4 + 0.6*0.4的能力(是吗?)

因此,我想到的一种优化方法如下:

  • 找到一个随机数,检查它是否有空,如果不是,则将其递增1并再试一次,依此类推
  • 如果达到最大数量,则继续使用最小数量

这应该给我一个最大运行时间为O(范围)的数字

这听起来很糟糕,但我认为不是,因为我向数据库提交随机数,并且他们都是初学者,这是不太可能的.那真的有多好/多少呢? …

php mysql random primary-key

18
推荐指数
1
解决办法
2051
查看次数

标签 统计

algorithm ×1

encryption ×1

mysql ×1

php ×1

primary-key ×1

random ×1