【问题标题】:creating unique random string创建唯一的随机字符串
【发布时间】:2014-10-20 01:58:39
【问题描述】:

我正在使用 php,我正在尝试在数据库中创建 1000 张票。每张票都需要它自己的唯一代码,由大约 6 个字符长的字母和数字组成。

EXP.    
Tbl_Tickets
ID     code
1      3F2jk7
2      2HGUF1       
3      9FJDNJ
4      MFJEY9
5      23988D

我想知道是否有一种简单的方法可以使用 php、excel 或任何其他方式来执行此操作。我知道我可以使用随机数生成器,但是对 Unique 的检查会有很大的 BigO 符号,并且检查会变得混乱。

【问题讨论】:

    标签: php excel random


    【解决方案1】:

    这将在 B1 到 B1001

    的列 B 中产生无重复的随机字符串
    Sub Lottery()
        Dim i As Long, j As Long, c As Collection
        Set c = New Collection
        v = Split("0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
        For i = 1 To 5000
            can = ""
            For j = 1 To 6
                can = can & v(Application.RandBetween(0, 35))
            Next j
            On Error Resume Next
                c.Add can, CStr(can)
            On Error GoTo 0
            If c.Count = 1000 Then Exit For
        Next i
    
        For i = 1 To 1000
        Cells(i + 1, 2).Value = c(i)
        Next i
    End Sub
    

    【讨论】:

      【解决方案2】:

      还有另一个选择。加密保证是唯一的,因此对数字 0、1、2、... 进行加密将为您提供保证唯一的随机输出。六个字符使用 Base32 为 30 位,使用 Base64 为 36 位。您将需要一个 30(或 36 位)密码。除非您有一个包含 Hasty Pudding 密码的库(不太可能),否则只需使用适当的块大小实现一个简单的四轮 Feistel cypher。它不会完全安全,但足以击败随意的攻击。

      【讨论】:

        【解决方案3】:

        您可以轻松地在 php 中创建一个字符串数组并将其写入数据库:

         function generateRandomString($length = 6, $letters = '1234567890QWERTYUIOPASDFGHJKLZXCVBNM'){
            $s = '';
            $lettersLength = strlen($letters)-1;
        
            for($i = 0 ; $i < $length ; $i++){
                $s .= $letters[rand(0,$lettersLength)];
            }
        
            return $s;
        } 
        // Create an array with random strings
        for ($i=0; $i<1000; $i++){
          $ticket_numbers = array();
          $ticket_number = generateRandomString();
          while (in_array($ticket_number,$ticket_numbers))
            $ticket_number = generateRandomString();
          $ticket_numbers[] = $ticket_number;
        }
        // Write the array to a database
        $con = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error");
        foreach ($ticket_numbers as $number){
          mysqli_query($con,"Your insert query using the value $number");
        }
        mysqli_close($con);
        

        这应该可以帮助您朝着正确的方向前进,尽管可能有更好的方法来做到这一点。

        函数 generateRandomString() 取自How to generate random numbers/letters with PHP/Javascript

        【讨论】:

        • 我推荐mt_rand 来代替rand。它更快一点,而且随机性更可靠。
        【解决方案4】:

        唯一不兼容随机,但以下可能适合:

        =CHOOSE(RANDBETWEEN(1,2),RANDBETWEEN(0,9),CHAR(RANDBETWEEN(65,90)))

        复制到 G 中填充六列(比如 A 到 F):

        =A1&amp;B1&amp;C1&amp;D1&amp;E1&amp;F1

        两者都复制到第 1100 行。然后选择 G,复制粘贴特殊值,并删除列 G 上的重复项,然后选择前 1000 个条目。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 2012-11-21
          • 2010-10-18
          相关资源
          最近更新 更多