C# 生成6位唯一标识(全数字,不带4的)
发布网友
发布时间:2024-10-07 17:29
我来回答
共3个回答
热心网友
时间:2024-12-01 12:06
USE tempdb
GO
-- 创建测试表
CREATE TABLE tb(id char(8))
-- 测试数据插入的处理时间, 记录开始处理的时间点
DECLARE @dt datetime
SET @dt = GETDATE()
-- 插入随机数据
SET NOCOUNT ON
DECLARE @row INT
-- 待插入数据
DECLARE @iid CHAR(8)
SET @row = 10000 -- 设置总记录数
WHILE @row >0
BEGIN
-- 显示提示信息, 表示还需要插入多行数据
RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT
-- 插入随机的位编码数据
SET ROWCOUNT @row
SET @iid = RIGHT(CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 6)
IF CHARINDEX('4',@iid)=0
INSERT tb SELECT
id = @iid
SET @row = @row - @@ROWCOUNT
END
-- 显示插入数据使用的时间
SELECT BeginDate = @dt, EndDate = GETDATE(),
Second = DATEDIFF(Second, @dt, GETDATE())
GO
-- 显示最终的结果记录是否正确
SELECT COUNT(*) FROM tb
GO
-- 删除测试
--DROP TABLE tb
简单的写了个点sql 实际数据应该是有40W多行但是我自己只用10000行做了测试~你要是用100万的数据集做测试建议把print去掉~太多了而且去重的部分要优化下
Ps:我假定是从1到99999所以可能实际和你需求有偏差~自己改下吧~大体应该没错~而且这玩意相当耗费性能。。我插入取得是100W以内的随机数算上判断重复加上插入和中间的输出(可以不要)居然要50秒 (后来又改了下2秒内完成)追问我自己写了个,向三张表插入十二万数据,判断重复,过滤带4的竟然要10分钟,不懂得怎么优化.
热心网友
时间:2024-12-01 12:06
public int getKey()
{
Random rd = new Random();
bool isOK = true;
int key = 0;
while (isOK)
{
key = (int)(rd.NextDouble() * 999999);
if (key.ToString().IndexOf("4") == -1)//判断是否包含4
{
//如果怕生成重复的数据,可以在这里加一个判断是否重复的方法
//if(CheckKey())
isOK = false;
}
}
return key;
}
热心网友
时间:2024-12-01 12:07
这是不可能的,你算算就知道了,一共能生成多少个标识。追问范围在100000到999999的
追答大致说个思路吧:
你要的全是数字,可以用oracle数据库的序列作为参考,100000递增,每次都得查询数据库当前的最大值进行递增,递增之后的值如果含有4那就舍弃继续递增。