我知道如何在PHP和MySQL上创建随机字符,但问题是我必须为一万个左右的行创建一个4字符随机字符串。最好的方法是确保它保持独特?
如果我需要但不长于12,我可以使用更长的字符串。
为了简单起见,表格存在我需要添加一个额外的列并用4个字符随机字符串填充它,键必须保持唯一。
答案 0 :(得分:3)
选项:
将所有可能的字符放在只有一列的表中。
val
------
0
1
...
9
a
b
...
z
使用此查询
SELECT CONCAT(a.val,b.val,c.val,d.val)
FROM chars AS a
JOIN chars AS b
JOIN chars AS c
JOIN chars AS d
ORDER BY RAND()
LIMIT 10000
另一方面,如果你需要一次获得一个ID,我会看到两种方法。
在这种情况下,您只需生成一个ID,看看它是否免费。如果没有尝试另一个。
在这种情况下,最好预先生成所有ID,随机播放,当您需要时,只需选择下一个可用ID。假设将它们全部放在一个表中,当您从该表中分配一个时,将其删除,以便不能再次拾取它。
如果您允许的字符为0-9a-z
,则表示该表将占用36 4 。那只是几MB。
答案 1 :(得分:2)
由于这些字符串必须是唯一的,为什么不使用数字自动增量值,然后将其转换为基于字符的值,类似于十进制到十六进制的转换。
如果您选择例如您只需创建一个将整数转换为“基数为62”的例程的所有字符和数字。
答案 2 :(得分:0)
您可以使用DISTINCT
关键字。
例如,以下查询将仅返回唯一行,您可以通过该行验证您的4个字符随机字符串是否仍为唯一:
mysql> SELECT DISTINCT random_strings FROM chars;
答案 3 :(得分:0)
这可能很冗长,但可以让你创造出你需要的东西:
CREATE FUNCTION gen_alphanum () RETURNS CHAR(4)
RETURN
ELT(FLOOR(1 + (RAND() * (50-1))), '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',
'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',);
)
答案 4 :(得分:0)
听起来你已经在MySQL中获得了用于创建这些随机值字符串的代码。
考虑这个选项:
创建User Defined Function in MySQL。让此函数运行SQL语句以生成并返回此新的随机字符串。确保在该创建语句中使用NOT EXISTS(SELECT MyRandomString FROM MyTable)
来检查表中是否已存在随机字符串。
插入新行时,请使用此函数的返回值分配到MyRandomString
列。
更新现有数据,只需:
UPDATE MyTable
SET MyRandomString = fn_CreateSomeRandomString()
INSERT INTO MyTable (foo, bar, MyRandomString)
VALUES ('','', fn_CreateSomeRandomString());
答案 5 :(得分:0)
如果你有MySQL 5.6,你可以按如下方式使用TO_BASE64:
select LEFT( TO_BASE64( SHA(rand()) ), 6 ) ;
或者,如果您没有5.6,
DELIMITER //
drop function if exists randChr //
create function randChr()
returns char
BEGIN
IF RAND() <= 0.5 THEN -- Lowercase
return CHAR( 97 + 25*rand() ) ;
ELSE -- uc
return CHAR( 65 + 25*rand() ) ;
END IF;
END //
drop function if exists randString //
create function randString( len int )
returns varchar(255)
BEGIN
SET @n = 0;
SET @res = '' ;
REPEAT
SET @res = concat( @res, randChr() ) ;
set @n = @n + 1 ;
UNTIL @n >= len END REPEAT;
return @res ;
END //
DELIMITER ;
-- USE:
select randString( 5 );
select randString( 60 );