- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我阅读了几个与我的问题相似的主题,但似乎没有一个对我很有帮助。
我有一个表单,用户可以在其中生成存储在具有唯一约束的列中的代码。代码是长度为 7 个字符的字符串。用户可以输入一个数字,程序会生成那么多代码,并且可以重复此过程,直到达到最大代码数。
我的问题是重复值。但不是在输入新条目时数据库中已经存在的值(我成功检查了这些值),但是新组(比如 10000)代码中的一些条目(可能)是相同的。所以我的代码在同一个事务中生成了两个(或更多)相同的代码,并且数据库中的唯一约束对此进行了提示。
我想在每次输入后检查数据库,但考虑到我们谈论的是 10000 条或有时更多的条目,这非常耗时。
所以现在我认为唯一的选择是首先修改生成它们的代码,因为它似乎效率低下并且生成 double 。
问题的很大一部分是所需的代码长度,否则我会使用纯“uniqid()”或类似的东西,但由于我必须将其限制为 7 个字符,我想这会使情况变得更糟.另外,我必须从代码中排除一些字符[标记为'problem_characters']。
这是代码,我无法正确修改它以仅生成唯一值。
$problem_characters = array("0", "o", "O", "I", "1", 1);
$code = md5(uniqid(rand(), true));
$extId = strtoupper(str_replace($problem_characters,rand(2,9),substr($code, 0, 7)));
//insert $extId in the database
@地理好的,我尝试了你的解决方案并且它有效(当然),但后来我遇到了一个新问题 - 在你的'if'的'else'部分我正在做以下事情:
$extId = strtoupper(str_replace($problem_characters,rand(2,9),substr($code, 0, 7)));
while(true){
if((!in_array($extId, $allExternalIdsHandled)) && (!in_array($extId, $newEnteredValues))){
break;
}else{
$extId = strtoupper(str_replace($problem_characters,rand(2,9),substr($code, 0, 7))); }
}
//insert the modified value in the DB here
所以,现在它进入了一个无限循环并且它没有用'break'命令中断,即使它应该随着'随机'调用的执行而改变,然后输入if并中断...
我没有看到这里的问题。有人可以给我一些指导吗?
编辑:它有时会挂起,有时不会。我刚刚输入了 10000 个值,并通过“其他”路径修改了两个条目。我使用日志观察到了这一点。
最佳答案
已经有 libraries为您完成艰苦的工作,允许您选择生成字符串和字符串长度时要使用的“字母表”。
您的“相同条目”问题称为 collision这是无法避免的。
编辑 因此,与 Geo 所建议的类似,我正在使用 PHP
创建一个包含 n
个唯一条目的列表。不同之处在于 SQL 插入可能会失败,因此我进行了 2 层迭代以确保我们填充了所需的总数:
<?php
require('hashids.php'); // I'm using the library I suggested
$hashids = new hashids('some salt', 7); // use the default alphabet, feel free to pass the 3rd parameter with the alphabet you want to use
$generationTries = 0;
$hashesInDBCount = 0; // get from your database
$desiredHashesCount = 50; // use a parameter
$totalDesiredHashes = $hashesInDBCount + $desiredHashesCount;
do
{
// when coming back in the loop, only generate what's still required
$desiredHashesCount = $totalDesiredHashes - $hashesInDBCount;
$generatedHashesCount = 0;
$generatedHashes = array();
while($generatedHashesCount < $desiredHashesCount)
{
$hash = $hashids->encrypt($generationTries++);
if(!in_array($hash, $generatedHashes))
{
array_push($generatedHashes, $hash);
++$generatedHashesCount;
}
}
// insert $generatedHashes in your Database
$hashesInDBCount = 50; // again, query your database as you might come through this loop more than once,
// I'm hardcoding the value to have a working example
}
while($hashesInDBCount < $totalDesiredHashes);
echo "Generated " . count($generatedHashes) . " hashes in " . $generationTries . " tries\n";
var_dump($generatedHashes);
这给了我这样的输出:
Generated 50 hashes in 50 tries
array(50) {
[0]=>
string(7) "eAcgAcx"
[1]=>
string(7) "Exidai8"
[2]=>
string(7) "ExTbqT8"
[3]=>
string(7) "4Acz8cB"
[4]=>
string(7) "LRipxir"
[5]=>
string(7) "zATe5Tx"
...
}
每次添加随机盐都会给你随机值
关于php - "Unique 7 character string"- 相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14042749/
我想在 MySQL 中创建一个基本的 users 表。 我不希望数据库中出现重复的电子邮件或重复的用户名。 在创建表时防止这种情况的最佳方法是什么? 和以下有什么区别: 1. UNIQUE(用户名),
不可能将用户或请求识别为唯一,因为欺骗是微不足道的。 但是,有一些方法组合起来可以阻止作弊尝试并为用户提供准独特的地位。 我知道以下内容: IP 地址 - 将每个访问者的 IP 地址存储在某种数据库中
我有 2 个表: attCatAppSet, attCatAppSet_translation 在这两个表上,我对 2 列(不是主键)应用了唯一约束,因此列对值不能重复。 GO ALTER TABLE
我目前有这个: class Committee(models.Model): # ...some fields... committee_xml_id = models.Integer
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: how to alter live mysql table to make a key non unique
unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的。在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。可以提供一个函数对象作为可选的第三个
我的模型中有一个这样的字段 name = models.CharField(max_length=100, unique=True) 但现在该表/模型有很多数据,需要更改True 到 False 但无
在 Typeorm 中,您可以在列选项中设置唯一标志,或将列设置为实体的唯一。 你什么时候会使用什么,有什么区别?@Unique(["firstName"]) https://typeorm.io/#
我创建了一个名为 state 的数据集来自内置矩阵state.x77有两个连续变量(人口和收入)和两个因素变量(区域和面积)。 我使用 tapply() 计算了按地区划分的平均收入, by() , a
关于 SQLite 的问题。 在 CREATE TABLE SQL 中,我们可以通过任何一种方式添加 UNIQUE 约束:列约束或表约束。我的问题很简单。它们的工作方式不同吗? 我能找到的唯一区别是,
我在 Django 1.8 中构建模型,我正在使用抽象继承(我假设这是导致问题的原因)。我有抽象模型,然后我有基于这些抽象模型的模型。我在某些模型之间也有 ForeignKey 和 ManyToMan
我见过几个示例表,一个是 UNIQUE INDEX,另一个是 UNIQUE KEY。两者有什么区别??还是两者都一样? 最佳答案 CREATE TABLE KEY 通常是 INDEX 的同义词。 您可
我试着比较了两者,一个是pandas.unique(),另一个是numpy.unique(),我发现后者实际上超过了第一个。 我不确定卓越是否是线性的。 谁能告诉我为什么在代码实现方面存在这种差异?在
使用 PowerShell,我通过“import-csv”将文件中的 csv-data 导入对象 $csvList。这个 csv 数据有一个名为 Benutzer 的列。当做这样的事情时: $csvL
我有一个名为 GroupMembers 的表,它表示参与网站上某些社区的用户列表。 列看起来像这样: groupId | accountId | role 如您所见,里面有一个名为“role”的
我需要一个不会因 Android 设备而改变的 ID,它在任何时候都应该是唯一的,即使 WIFI、SIM 卡、蓝牙不存在,以及当用户重置他/她的手机或刷新新操作系统时也是如此。 我知道这些 Id。IM
假设我有“主题”表 CREATE TABLE subject (id int PRIMARY KEY, name VARCHAR(255) **UNIQUE**) 和相关的映射对象, @Entity
好的,让我解释一下场景。我有一个“订单”表,其中有一个自动增量键“orderno”。该表也有一个字段“orderdate”。我想要的是格式化的订单号。 (orderno_formatted) 采用以下
我有一个 boost::multi_index_container 其元素是这样的结构: struct Elem { A a; B b; C c; }; 主键(在数据库意义上)
当前列是 VARCHAR(255) NOT NULL,那么如何将其更改为 TEXT NOT NULL? 注意:要更改其属性类型的列是另一列的 UNIQUE KEY 组合。例如 唯一键(名称、描述) 列
我是一名优秀的程序员,十分优秀!