【问题标题】:How to create a unique random string in PHP and SQL relational data base?如何在 PHP 和 SQL 关系数据库中创建唯一的随机字符串?
【发布时间】:2021-09-08 04:47:54
【问题描述】:

我正在制作你的电子管的复制品/克隆。但我面临着为视频、频道、播放列表等制作非常独特的 id 的问题。就像你做的那样。

视频 ID

https://www.youtube.com/watch?v=G6Hai-W9pRE

unique video id = G6Hai-W9pRE

频道 ID

https://www.youtube.com/channel/UCeVMnSShP_Iviwkknt83cww

unique channel id = UCeVMnSShP_Iviwkknt83cww

我在互联网上研究并找到了一些解决方案,例如。

解决方案 1

step - 1 : create a random number / string

step - 2 : search for the string in the database , if found return to step 1 or you found your 
           unique id  

问题

如果使用了 90% 的数字,则从 1-100000000 中找到唯一的编号并不是一个很好或有效的方法我认为

解决方案 2

uuid() concept or similar to this random no generator concepts

但我不确定它们是否符合我的要求,或者是否由 2 个并行运行的脚本完成相同的操作?我最终会得到非唯一或重复的 ID ...

我想知道的是---

  1. 最有效的方法是什么(生成唯一的随机字符串)。
  2. 优管做了什么
  3. 我应该使用什么方法。

我只知道这个平台,不知道在哪里可以找到这类问题的解决方案。 如果您能详细阐述和解释我的问题,那就太好了。

提前致谢;

【问题讨论】:

  • 您可以使用序列来获取递增的数字。这就是他们的目的
  • 那么字符串呢.. 比如unique channel id = UCeVMnSShP_Iviwkknt83cww
  • 最快和最简单的将是一个 GUID,该算法将确保唯一性并且不需要时间来生成。如果你想变得更漂亮,你也许可以散列一些关于视频及其上传者的独特属性,并使用散列作为 id。
  • Dazz 你能解释一下你在说什么以及你使用了什么方法吗?我可以散列哪些独特的属性?请我想要一个非常深刻的见解
  • 有什么要求?你提到了“独特”。但是“不容易被黑”(因此不是一个简单的数字)呢? “能够重建原始字符串”(与加密一样)怎么样?其他?

标签: php mysql sql database-design unique-key


【解决方案1】:

你应该使用 MySQL 内置的uuid() 函数。

uuid() 将生成唯一值,即使是 if two are generated at the same timeuuid() 有 3 个组件:

  1. 前 3 部分由时间戳生成
  2. 第四部分是一个随机字符串,用于补偿两个不同调用中可能相同的时间戳
  3. 第五部分是一个 IEEE 802 节点号,用于在空间上区分 uuid。

您不必担心重复。

【讨论】:

    【解决方案2】:

    MD5()SHA1() 是本质上唯一的单向加密。使用您想对用户隐藏的任何唯一值。结果是十六进制,可以转换为 base64 或二进制。黑客无法找回原始字符串。

    BASE64()。将此应用于独特的事物。但请注意,它是可逆的。也就是说,黑客可以轻松地重建它的价值。 (post.it 等似乎是这样做的。)

    RAND()。由于重复的机会越来越大,使用起来太混乱了。此外,它会在 2^30 次调用后重复。

    MD5(auto_inc)。内部使用AUTO_INCREMENT 得到 1,2,3,... 然后用单向哈希隐藏它。但是,字典查找(密码破解者使用)会很快将c4ca4238a0b923820dcc509a6f75849b 识别为MD5(1)

    我会YouTube(等)做一些微不足道的事情,比如AUTO_INCREMENTBASE64。这样做的好处是随着数量的增长越来越长:

    +------------------+--------------------+----------------------+
    | TO_BASE64(0x100) | TO_BASE64(0x10000) | TO_BASE64(0x1000000) |
    +------------------+--------------------+----------------------+
    | AQA=             | AQAA               | AQAAAA==             |
    +------------------+--------------------+----------------------+
    

    (可以删除尾随的=s 而不会丢失信息。)

    UUID()。请参阅 Joundill 的回答。那就是 MySQL 使用的描述“类型 4”。还有其他类型。

    尺寸:

    十六进制(MD5 等)- 每个字符 4 位。
    UUID -- 十六进制,加上一些破折号,因此平均值略小于 4。
    BASE64 -- 每个字符几乎 6 位。
    二进制——在 URL 中不实用;它会被扩展(例如,urlencode())到比 4/char 更糟糕的东西。

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 2014-10-20
      • 2019-09-11
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多