C# 生成6位唯一标识(全数字,不带4的)

随机生成6位唯一标识(对本地数据库来讲)
2024-12-11 15:53:46
推荐回答(3个)
回答1:

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秒内完答做成)

回答2:

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;
}

回答3:

这是不可能的,你算算就知道了,一共能生成多少个标识。