当前位置:编程学习 > VB >>

怎样以最快的速度生成10000万个随机的不同16位数?

我的方法是借助于数据库的。数据库表的字段设置主键后插入重复数据会提示失败,我就写了个程序不断地往数据库里插入数据,遇到主键重复错误就忽略。代码如下:
Private Sub Command1_Click()
    Dim s$
    Dim i As Single, sng1 As Single
    Dim j%
    On Error resume next'当数据库主键字段v_no有重复的时忽略错误
    For i = 1 To 10000000
        s = ""
        For j = 1 To 16'生成随机16位数
            Randomize
            s = s & Mid("0123456789", Int(Rnd * 9) + 1, 1)
        Next
        Me.Caption = i & " " & s: DoEvents
        conn.Execute "INSERT INTO verify(v_no)  VALUES('" & s & "')"
    Next
End Sub


我用上述方法生成发现最多也就生成100万个不同的数据。循环一千万次。 当重复执行后,也就是再循环1000万次,数据也就多了一两万而已。 重复的太多!! 怎样最快速的生成呢?? 现在来看这个方法不可行,半个小时了才多几百个新的随机16位数据。
--------------------编程问答-------------------- 先生成,再打乱 --------------------编程问答-------------------- 使用前缀树,每产生一个,就把对印的路径标记出来。 --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
使用前缀树,每产生一个,就把对印的路径标记出来。

了解到些信息。有人用的rsa,对数据加密和解密。

每次根本不用考虑重复。 直接对1~10万 进行rsa加密成16位,都是一对一的。 而且可以解密。caozhy有了解这方面么? --------------------编程问答--------------------
引用 3 楼 sysdzw 的回复:
Quote: 引用 2 楼 caozhy 的回复:

使用前缀树,每产生一个,就把对印的路径标记出来。

了解到些信息。有人用的rsa,对数据加密和解密。

每次根本不用考虑重复。 直接对1~10万 进行rsa加密成16位,都是一对一的。 而且可以解密。caozhy有了解这方面么?

不可能在不记忆和随机同时满足的情况下做到不重复。 --------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
Quote: 引用 3 楼 sysdzw 的回复:

Quote: 引用 2 楼 caozhy 的回复:

使用前缀树,每产生一个,就把对印的路径标记出来。

了解到些信息。有人用的rsa,对数据加密和解密。

每次根本不用考虑重复。 直接对1~10万 进行rsa加密成16位,都是一对一的。 而且可以解密。caozhy有了解这方面么?

不可能在不记忆和随机同时满足的情况下做到不重复。
md5怎么说?

我的意思是人为记录了起始和结尾有序的10万个数了,用rsa加密后变成了16位寸数字无序的“密码”,加密过程可逆。

找到个资源,可以研究下。
http://download.csdn.net/detail/xxlcb/2880873 --------------------编程问答--------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = new GenDec16();
            foreach (var item in obj)
            {
                Console.WriteLine(item);
            }
        }
    }

    class GenDec16 : IEnumerator, IEnumerator<string>, IEnumerable<string>
    {
        class Tree
        {
            public Tree(int Length)
            {
                node = new Node(0, Length);
            }
            Node node;

            public string GenNewValue() { return node.GenNewValue(); }

            public bool HasNewValue
            {
                get
                {
                    return node.HasNewValue;
                }
            }
        }

        class Node
        {
            static Random rnd = new Random();

            public Node(int id, int level)
            {
                ID = id;
                Level = level;
                HasNewValue = true;
                if (level > 0) ChildNodes = new List<Node>();
            }

            public override string ToString()
            {
                return string.Format("{0}: childs={1}, hasnew={2}.", 
                    ID, 
                    string.Join(",", ChildNodes.Select(x => x.ID).OrderBy(x => x)), 
                    HasNewValue);
            }

            public int ID { get; set; }
            public bool HasNewValue { get; set; }
            public int Level { get; set; }
            List<Node> ChildNodes { get; set; }

            public string GenNewValue()
            {
                string result = "-";
                if (Level == 0)
                {
                    result = "";
                    HasNewValue = false;
                }
                else
                {
                    do
                    {
                        int n = Node.rnd.Next(0, 10);
                        var node = ChildNodes.SingleOrDefault(x => x.ID == n);
                        if (node == null)
                        {
                            node = new Node(n, Level - 1);
                            ChildNodes.Add(node);
                        }
                        if (!node.HasNewValue) continue;
                        result = n.ToString() + node.GenNewValue();
                    } while (result == "-");
                    HasNewValue = ChildNodes.Count != 10 || ChildNodes.Any(x => x.HasNewValue);
                }
                return result;
            }
        }

        Tree tree;

        public GenDec16()
        {
            (this as IEnumerator).Reset();
        }

        object IEnumerator.Current
        {
            get { return tree.GenNewValue(); }
        }

        bool IEnumerator.MoveNext()
        {
            return tree.HasNewValue;
        }

        void IEnumerator.Reset()
        {
            tree = new Tree(16); //16位
        }

        string IEnumerator<string>.Current { get { return tree.GenNewValue(); } }

        void IDisposable.Dispose()
        {
            
        }

        IEnumerator<string> IEnumerable<string>.GetEnumerator()
        {
            return this;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this;
        }
    }
}


贴一个我写的代码给你,跑1千万,大约需要1分钟。当然需要把输出去掉。 --------------------编程问答--------------------
引用 5 楼 sysdzw 的回复:
Quote: 引用 4 楼 caozhy 的回复:

Quote: 引用 3 楼 sysdzw 的回复:

Quote: 引用 2 楼 caozhy 的回复:

使用前缀树,每产生一个,就把对印的路径标记出来。

了解到些信息。有人用的rsa,对数据加密和解密。

每次根本不用考虑重复。 直接对1~10万 进行rsa加密成16位,都是一对一的。 而且可以解密。caozhy有了解这方面么?

不可能在不记忆和随机同时满足的情况下做到不重复。
md5怎么说?

我的意思是人为记录了起始和结尾有序的10万个数了,用rsa加密后变成了16位寸数字无序的“密码”,加密过程可逆。

找到个资源,可以研究下。
http://download.csdn.net/detail/xxlcb/2880873

反正不可能在不记忆和随机同时满足的情况下做到不重复。如果你增加生成的随机数的长度,可以降低重复的概率,最终当这个概率无限小的时候,可以视作不重复。 --------------------编程问答-------------------- 洗牌算法吧,先按顺序生成,然后随机打乱输出 --------------------编程问答--------------------
引用 6 楼 caozhy 的回复:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = new GenDec16();
            foreach (var item in obj)
            {
                Console.WriteLine(item);
            }
        }
    }

    class GenDec16 : IEnumerator, IEnumerator<string>, IEnumerable<string>
    {
        class Tree
        {
            public Tree(int Length)
            {
                node = new Node(0, Length);
            }
            Node node;

            public string GenNewValue() { return node.GenNewValue(); }

            public bool HasNewValue
            {
                get
                {
                    return node.HasNewValue;
                }
            }
        }

        class Node
        {
            static Random rnd = new Random();

            public Node(int id, int level)
            {
                ID = id;
                Level = level;
                HasNewValue = true;
                if (level > 0) ChildNodes = new List<Node>();
            }

            public override string ToString()
            {
                return string.Format("{0}: childs={1}, hasnew={2}.", 
                    ID, 
                    string.Join(",", ChildNodes.Select(x => x.ID).OrderBy(x => x)), 
                    HasNewValue);
            }

            public int ID { get; set; }
            public bool HasNewValue { get; set; }
            public int Level { get; set; }
            List<Node> ChildNodes { get; set; }

            public string GenNewValue()
            {
                string result = "-";
                if (Level == 0)
                {
                    result = "";
                    HasNewValue = false;
                }
                else
                {
                    do
                    {
                        int n = Node.rnd.Next(0, 10);
                        var node = ChildNodes.SingleOrDefault(x => x.ID == n);
                        if (node == null)
                        {
                            node = new Node(n, Level - 1);
                            ChildNodes.Add(node);
                        }
                        if (!node.HasNewValue) continue;
                        result = n.ToString() + node.GenNewValue();
                    } while (result == "-");
                    HasNewValue = ChildNodes.Count != 10 || ChildNodes.Any(x => x.HasNewValue);
                }
                return result;
            }
        }

        Tree tree;

        public GenDec16()
        {
            (this as IEnumerator).Reset();
        }

        object IEnumerator.Current
        {
            get { return tree.GenNewValue(); }
        }

        bool IEnumerator.MoveNext()
        {
            return tree.HasNewValue;
        }

        void IEnumerator.Reset()
        {
            tree = new Tree(16); //16位
        }

        string IEnumerator<string>.Current { get { return tree.GenNewValue(); } }

        void IDisposable.Dispose()
        {
            
        }

        IEnumerator<string> IEnumerable<string>.GetEnumerator()
        {
            return this;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this;
        }
    }
}


贴一个我写的代码给你,跑1千万,大约需要1分钟。当然需要把输出去掉。

顺便说下,如果你使用一种机制将tree对象持久化的话,就可以做到中断/继续生成。

这个算法的好处在于,你可以不一次性地产生全部数据(那样要好久),也不需要很多内存,就可以像使用自来水那样随时使用。并且效率很高。 --------------------编程问答-------------------- 我不知道你是不是接受这种算法,我电脑内存不够,没完整跑。

Private Sub Command1_Click()
    Dim D(99999999) As String, I As Long, TempID As Long, Temp As String
    Randomize Timer
    
    For I = 0 To UBound(D)
        '前八位随机生成,后八位顺序产生,不管怎么说,肯定不重复
        D(I) = Format(10000000 * Rnd, "00000000") & Format(I, "00000000")
    Next
    
    '你觉得随机性不够的话,再做洗牌处理
    For I = 0 To 99
      TempID = (UBound(D) + 1) * Rnd
      Temp = D(TempID)
      D(TempID) = D(I)
      D(I) = Temp
    Next

End Sub
--------------------编程问答-------------------- 这样也好吧,至少接受起来比前边的好一些。

Private Sub Command1_Click()
    Dim D(99999999) As String, I As Long, Temp As String, J As Long
    Randomize Timer
    
    For I = 0 To UBound(D)
        '前八位随机生成,后八位顺序产生,不管怎么说,肯定不重复
        Temp = Format(10000000 * Rnd, "00000000") & Format(I, "00000000")
        For J = 1 To 8
            D(I) = D(I) & Mid(Temp, J, 1) & Mid(Temp, J + 8, 1) '把序号穿插在里边,只要序列号的位置固定
        Next
    Next
End Sub
--------------------编程问答--------------------
引用 11 楼 bakw 的回复:
这样也好吧,至少接受起来比前边的好一些。

Private Sub Command1_Click()
    Dim D(99999999) As String, I As Long, Temp As String, J As Long
    Randomize Timer
    
    For I = 0 To UBound(D)
        '前八位随机生成,后八位顺序产生,不管怎么说,肯定不重复
        Temp = Format(10000000 * Rnd, "00000000") & Format(I, "00000000")
        For J = 1 To 8
            D(I) = D(I) & Mid(Temp, J, 1) & Mid(Temp, J + 8, 1) '把序号穿插在里边,只要序列号的位置固定
        Next
    Next
End Sub
不接受,看起来不够无序,不过是个思路。谢谢。 --------------------编程问答--------------------
引用 9 楼 caozhy 的回复:
Quote: 引用 6 楼 caozhy 的回复:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = new GenDec16();
            foreach (var item in obj)
            {
                Console.WriteLine(item);
            }
        }
    }

    class GenDec16 : IEnumerator, IEnumerator<string>, IEnumerable<string>
    {
        class Tree
        {
            public Tree(int Length)
            {
                node = new Node(0, Length);
            }
            Node node;

            public string GenNewValue() { return node.GenNewValue(); }

            public bool HasNewValue
            {
                get
                {
                    return node.HasNewValue;
                }
            }
        }

        class Node
        {
            static Random rnd = new Random();

            public Node(int id, int level)
            {
                ID = id;
                Level = level;
                HasNewValue = true;
                if (level > 0) ChildNodes = new List<Node>();
            }

            public override string ToString()
            {
                return string.Format("{0}: childs={1}, hasnew={2}.", 
                    ID, 
                    string.Join(",", ChildNodes.Select(x => x.ID).OrderBy(x => x)), 
                    HasNewValue);
            }

            public int ID { get; set; }
            public bool HasNewValue { get; set; }
            public int Level { get; set; }
            List<Node> ChildNodes { get; set; }

            public string GenNewValue()
            {
                string result = "-";
                if (Level == 0)
                {
                    result = "";
                    HasNewValue = false;
                }
                else
                {
                    do
                    {
                        int n = Node.rnd.Next(0, 10);
                        var node = ChildNodes.SingleOrDefault(x => x.ID == n);
                        if (node == null)
                        {
                            node = new Node(n, Level - 1);
                            ChildNodes.Add(node);
                        }
                        if (!node.HasNewValue) continue;
                        result = n.ToString() + node.GenNewValue();
                    } while (result == "-");
                    HasNewValue = ChildNodes.Count != 10 || ChildNodes.Any(x => x.HasNewValue);
                }
                return result;
            }
        }

        Tree tree;

        public GenDec16()
        {
            (this as IEnumerator).Reset();
        }

        object IEnumerator.Current
        {
            get { return tree.GenNewValue(); }
        }

        bool IEnumerator.MoveNext()
        {
            return tree.HasNewValue;
        }

        void IEnumerator.Reset()
        {
            tree = new Tree(16); //16位
        }

        string IEnumerator<string>.Current { get { return tree.GenNewValue(); } }

        void IDisposable.Dispose()
        {
            
        }

        IEnumerator<string> IEnumerable<string>.GetEnumerator()
        {
            return this;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this;
        }
    }
}


贴一个我写的代码给你,跑1千万,大约需要1分钟。当然需要把输出去掉。

顺便说下,如果你使用一种机制将tree对象持久化的话,就可以做到中断/继续生成。

这个算法的好处在于,你可以不一次性地产生全部数据(那样要好久),也不需要很多内存,就可以像使用自来水那样随时使用。并且效率很高。
代码没完全看懂。。但是我觉得靠随机数去处理这个问题 方向明显偏了。 因为还有个致命的问题就是海量数据的时候数据库查询是个很大的问题。

新架构打算这样。

批次表:

id  起始      结束    使用日期    备注   批次信息描述  产品类别
1   1        100000   2013-1-5   10万个数据
2   100001   300000   2013-5-13   30w个
3   300001   420000   2013-8-15   12万个数据



--每次生成的时候我都用myras逐个加密成16位数的纯数字(这个可以做到一对一),秘钥只有我自己知道。
--当需要查询一个某个数据的信息时我只要用秘钥解密,看介于那条记录。查询会很快。
select * form 批次表 where xx >=起始 and xx<=结束

--------------------编程问答-------------------- 呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。 --------------------编程问答-------------------- 还可以加时间截的办法来生成随时不重复的序列号,也一样,要突破自己一个心理限制,而且这样子的话生成的速度会有限制。 --------------------编程问答--------------------
引用 14 楼 bakw 的回复:
呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。
不是这个意思。因为这样跟半个流水号差不多。要严格的随机无序。 --------------------编程问答-------------------- 没有,你可以试下,产生1千万个数据使用大约1100万个Node,每个十几个字节,可以在100MB数量级上搞定。
至于查找某个数字是否已经存在,更是瞬间完成。因为只要遍历16个节点就可以了。 --------------------编程问答-------------------- 反正我可以负责地告诉你,无论你加密解密,都回避不了这样一个事实,如果不记录所有已经产生的数据,无法做到绝对意义上的不重复。我用的算法,只是将存储和检索已有数据做了优化而已。前缀树避免了遍历整个列表就可以查询出一条数字是否已经存在。 --------------------编程问答--------------------
引用 17 楼 caozhy 的回复:
没有,你可以试下,产生1千万个数据使用大约1100万个Node,每个十几个字节,可以在100MB数量级上搞定。
至于查找某个数字是否已经存在,更是瞬间完成。因为只要遍历16个节点就可以了。
我只是个会vb的小白。 那代码没完全看懂。只知道数据结构里树查找遍历是很快。 有时间再研究研究了。 最终数据量可能是几亿级的,access还有空间大小估计都是个问题。所以没有其他路子了。 我先看看myras(数字,秘钥)怎么实现,目标是16位纯数字。

--------------------编程问答--------------------
引用 16 楼 sysdzw 的回复:
Quote: 引用 14 楼 bakw 的回复:

呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。
不是这个意思。因为这样跟半个流水号差不多。要严格的随机无序。

我不说谁知道,如果我不告诉你算法,我说我提供给你一千万个随机号,那你觉得呢?觉得可行的话我帮你生成序列号,你拿着用,别管我怎么算出来,保证不重复。 --------------------编程问答--------------------
引用 18 楼 caozhy 的回复:
反正我可以负责地告诉你,无论你加密解密,都回避不了这样一个事实,如果不记录所有已经产生的数据,无法做到绝对意义上的不重复。我用的算法,只是将存储和检索已有数据做了优化而已。前缀树避免了遍历整个列表就可以查询出一条数字是否已经存在。
记录了已经存在的数据了。 只是记录的明文。明文是有序使用的,我人为的可以保证它不重复。 那表格看起来有点像磁盘分区表。。 --------------------编程问答--------------------
引用 20 楼 bakw 的回复:
Quote: 引用 16 楼 sysdzw 的回复:

Quote: 引用 14 楼 bakw 的回复:

呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。
不是这个意思。因为这样跟半个流水号差不多。要严格的随机无序。

我不说谁知道,如果我不告诉你算法,我说我提供给你一千万个随机号,那你觉得呢?觉得可行的话我帮你生成序列号,你拿着用,别管我怎么算出来,保证不重复。
我以前想过,空出前三位表示作为代号。但是某个批次出来的产品,前面都一样的编号是不允许的。所以废弃了。 我本来是打算把这前三位代号分散到不连续的位,但是还是能看出来。 这方案我考虑过很深了。 --------------------编程问答-------------------- 放在sqlserver区一个帖子。
http://bbs.csdn.net/topics/390548590

本打算用sqlserver生成海量数据慢慢用的。大牛确实多。 --------------------编程问答-------------------- 你可以用代换法啊,把 1和9代换,3和6代换,这样怎么还会看得出来? --------------------编程问答-------------------- 哎,睡觉了,主要还是心理这关过不去。N年前我就出过这种主意,都没人信。见光死算法吧。 --------------------编程问答--------------------
引用 24 楼 bakw 的回复:
你可以用代换法啊,把 1和9代换,3和6代换,这样怎么还会看得出来?
再想想。  对调后可能还是一样。 对调后可能和另外一个数字重复了。 不说了 随机的方案反正已经否决了。 老大也没多少空间让我用。100万就占用空间200M了。 access数据量达到500万好像就极不稳定了,select一下都要有延迟。  --------------------编程问答--------------------
引用 19 楼 sysdzw 的回复:
Quote: 引用 17 楼 caozhy 的回复:

没有,你可以试下,产生1千万个数据使用大约1100万个Node,每个十几个字节,可以在100MB数量级上搞定。
至于查找某个数字是否已经存在,更是瞬间完成。因为只要遍历16个节点就可以了。
我只是个会vb的小白。 那代码没完全看懂。只知道数据结构里树查找遍历是很快。 有时间再研究研究了。 最终数据量可能是几亿级的,access还有空间大小估计都是个问题。所以没有其他路子了。 我先看看myras(数字,秘钥)怎么实现,目标是16位纯数字。



myras(数字,秘钥)
我不管myras的实现,但是如果你的数字大于16位,函数的输出是16位,则这个函数的输出必然有重复。 --------------------编程问答-------------------- 传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。 --------------------编程问答-------------------- 我最初的想法也是用8+8或5+6+5的方式来串接,1000W条数据,重复的可能性非常小。
我看了下8+8的串接结果,感觉已经“很随机”了。

你主贴中,Randomize 在最内层进行调用,并且字符串操作量非常大,速度当然会很慢。
Randomize在循环最内层调用也对“随机性”基本没什么增强作用。
并且,“Randomize + Rnd * 9”也会造成重复率极高。
--------------------编程问答--------------------
引用 29 楼 Chen8013 的回复:
我最初的想法也是用8+8或5+6+5的方式来串接,1000W条数据,重复的可能性非常小。
我看了下8+8的串接结果,感觉已经“很随机”了。

你主贴中,Randomize 在最内层进行调用,并且字符串操作量非常大,速度当然会很慢。
Randomize在循环最内层调用也对“随机性”基本没什么增强作用。
并且,“Randomize + Rnd * 9”也会造成重复率极高。
之前一直在外层的。后来发现一直不产生新数据就挪进去了。 拼接的过程中不知道你怎么打乱的。数据量很大。 或许是什么随机拼接大法? --------------------编程问答--------------------
引用 28 楼 sysdzw 的回复:
传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。


是的,要这么说,构造一个编码很简单。

随便举例:

10位整数和6位随机数做异或,结果是10位异或以后的整数和那6位随机数。 --------------------编程问答-------------------- 线性同余: http://bbs.csdn.net/topics/190019980 --------------------编程问答--------------------
Private Sub Command1_Click()
   Const TEXTBUFF As String = "0000000000000000"
   Const ITEMSIZE As Long = 10000000
   Const MULTIPLE As Long = 99999999   '用“8+8”
      Dim strTextOut(ITEMSIZE - 1) As String
      Dim strTemp$, i&
      
   Randomize
   For i = 0 To TEXTBUFF - 1
      strTemp = TEXTBUFF
      Mid$(strTemp, 1) = Int(Rnd() * MULTIPLE)
      Mid$(strTemp, 9) = Int(Rnd() * MULTIPLE)
      strTextOut(i) = strTemp
   Next
End Sub

--------------------编程问答-------------------- 预先生成数据,添加从表里直接获取,删除归还到表中,即可。
即用有序的,随机数表,表示无序的随机数。


--------------------编程问答-------------------- 数据生成用洗牌算法!
数据太小,可以组合以组成更大的随机数。
使用,归还算法,可以用静态链表。
--------------------编程问答-------------------- 都是高手来的 --------------------编程问答--------------------
引用 22 楼 sysdzw 的回复:
Quote: 引用 20 楼 bakw 的回复:

Quote: 引用 16 楼 sysdzw 的回复:

Quote: 引用 14 楼 bakw 的回复:

呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。
不是这个意思。因为这样跟半个流水号差不多。要严格的随机无序。

我不说谁知道,如果我不告诉你算法,我说我提供给你一千万个随机号,那你觉得呢?觉得可行的话我帮你生成序列号,你拿着用,别管我怎么算出来,保证不重复。
我以前想过,空出前三位表示作为代号。但是某个批次出来的产品,前面都一样的编号是不允许的。所以废弃了。 我本来是打算把这前三位代号分散到不连续的位,但是还是能看出来。 这方案我考虑过很深了。


我用10秒钟给你生成1000万不重复的16位串号,真不知道你们到底认为有什么技术难点。。。。

--------------------编程问答-------------------- 文件大小175.7MB --------------------编程问答--------------------
引用 38 楼 benben2301 的回复:
文件大小175.7MB


他肯定会说不够随机。。 --------------------编程问答--------------------
对随机数的定义不同。楼主所说的,是不重复的 16 位数。

但实际上,FIPS 标准对随机数的检测要严格得多,对随机串长的定义也是不固定的。也就是说,以楼主的方法得到的“随机数”文件,未必能通过随机数检测。通俗地说,他们要检测你的随机数序列中各种串长的重复性和对称性。检测方法十分复杂,包括很多项检测。

实际上 ANSI 在 X9.31 及其增补文件中,已经定义过伪随机数的生成方法:

- 基于 SHA-1 的 G 函数生成法;
- 基于 DES 的 G 函数生成法;
- 基于 TDES 的生成法;
- 基于 AES 的生成法。

用这些规定方法,很容易得到可以通过检测的随机数。

这些随机数生成方法是美国规定用于银行生成 RSA 数字签名用的密钥对的。其严格的密钥生成算法规定,主要是为了对抗银行卡持有人对付款交易的抵赖。
--------------------编程问答--------------------
引用 37 楼 benben2301 的回复:
Quote: 引用 22 楼 sysdzw 的回复:

Quote: 引用 20 楼 bakw 的回复:

Quote: 引用 16 楼 sysdzw 的回复:

Quote: 引用 14 楼 bakw 的回复:

呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。
不是这个意思。因为这样跟半个流水号差不多。要严格的随机无序。

我不说谁知道,如果我不告诉你算法,我说我提供给你一千万个随机号,那你觉得呢?觉得可行的话我帮你生成序列号,你拿着用,别管我怎么算出来,保证不重复。
我以前想过,空出前三位表示作为代号。但是某个批次出来的产品,前面都一样的编号是不允许的。所以废弃了。 我本来是打算把这前三位代号分散到不连续的位,但是还是能看出来。 这方案我考虑过很深了。


我用10秒钟给你生成1000万不重复的16位串号,真不知道你们到底认为有什么技术难点。。。。

看起来很随机了。每个16位数用了几次随机函数?还是其他的什么系统函数? 10秒钟就1000万很强大了。 --------------------编程问答--------------------
引用 31 楼 caozhy 的回复:
Quote: 引用 28 楼 sysdzw 的回复:

传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。


是的,要这么说,构造一个编码很简单。

随便举例:

10位整数和6位随机数做异或,结果是10位异或以后的整数和那6位随机数。
版主,这个方法做下来的话,会发现1和2加密后会发现只有一两位是有差异。这是不行的。 --------------------编程问答--------------------
引用 42 楼 sysdzw 的回复:
Quote: 引用 31 楼 caozhy 的回复:

Quote: 引用 28 楼 sysdzw 的回复:

传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。


是的,要这么说,构造一个编码很简单。

随便举例:

10位整数和6位随机数做异或,结果是10位异或以后的整数和那6位随机数。
版主,这个方法做下来的话,会发现1和2加密后会发现只有一两位是有差异。这是不行的。


不会啊。因为产生的6位随机数不同,用来异或后面10位出来的也不同。 --------------------编程问答--------------------
引用 43 楼 caozhy 的回复:
Quote: 引用 42 楼 sysdzw 的回复:

Quote: 引用 31 楼 caozhy 的回复:

Quote: 引用 28 楼 sysdzw 的回复:

传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。


是的,要这么说,构造一个编码很简单。

随便举例:

10位整数和6位随机数做异或,结果是10位异或以后的整数和那6位随机数。
版主,这个方法做下来的话,会发现1和2加密后会发现只有一两位是有差异。这是不行的。


不会啊。因为产生的6位随机数不同,用来异或后面10位出来的也不同。
哦,那这样好像不可逆了啊?因为不知道原来参与异或的是什么数。 --------------------编程问答--------------------
引用 44 楼 sysdzw 的回复:
Quote: 引用 43 楼 caozhy 的回复:

Quote: 引用 42 楼 sysdzw 的回复:

Quote: 引用 31 楼 caozhy 的回复:

Quote: 引用 28 楼 sysdzw 的回复:

传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。


是的,要这么说,构造一个编码很简单。

随便举例:

10位整数和6位随机数做异或,结果是10位异或以后的整数和那6位随机数。
版主,这个方法做下来的话,会发现1和2加密后会发现只有一两位是有差异。这是不行的。


不会啊。因为产生的6位随机数不同,用来异或后面10位出来的也不同。
哦,那这样好像不可逆了啊?因为不知道原来参与异或的是什么数。


可逆啊,前六位或者后六位明文保存这个随机数。 --------------------编程问答--------------------
引用 45 楼 caozhy 的回复:
Quote: 引用 44 楼 sysdzw 的回复:

Quote: 引用 43 楼 caozhy 的回复:

Quote: 引用 42 楼 sysdzw 的回复:

Quote: 引用 31 楼 caozhy 的回复:

Quote: 引用 28 楼 sysdzw 的回复:

传进去的数据和输出的数据是有个关系的。

你说的对 理论上必然会重复。

我得考虑下看看多少位一下不会重复。 加密后肯定要被明文大。 应该存在着10位以下映射为16位 还是没有问题的吧。 10位数的话是100亿,这辈子应该够用了。。


是的,要这么说,构造一个编码很简单。

随便举例:

10位整数和6位随机数做异或,结果是10位异或以后的整数和那6位随机数。
版主,这个方法做下来的话,会发现1和2加密后会发现只有一两位是有差异。这是不行的。


不会啊。因为产生的6位随机数不同,用来异或后面10位出来的也不同。
哦,那这样好像不可逆了啊?因为不知道原来参与异或的是什么数。


可逆啊,前六位或者后六位明文保存这个随机数。
这个思路不错。我再变换变换。 MsgBox 9999999999 Xor 1 这个试了下发现溢出。发现到MsgBox 1999999999 Xor 1 不溢出了,不过也有20亿个数字了,足够了。 --------------------编程问答-------------------- 如果直接按“序号 xor 随机数”+ 随机数 的格式来产生,楼主肯定觉得这个“不够随机”了。


我觉得可以这样处理一下,效果好一些:“(序号 Xor 随机数)循环移位”+ 随机数
循环移位只对低31位进行,让符号位保持为0(这样始终保持为正数)。
移位数,用随机数的低4位的值来决定(循环移0~15位)。

由于0~1000W的序号,只用到了低3字节,最高字节始终是0,可以人为的置入非0值参与移位。
比如 “序号 Or &H5C000000”进行循环移位。

这样处理后,显得比较随机,并且还能够还原出“原始序号”。
--------------------编程问答-------------------- 只是,不知道这样处理后,会不会造成出现“数据重复”的现象。 --------------------编程问答--------------------
Dim i, sngRnd1, strJiami
Dim strPart1$, strPart2$, strPart3$, strPart4$, strTemp$
Const TEXTBUFF As String = "0000000000000000"
txtresult1.Text = ""
Randomize
For i = t1.Text To t2.Text
    strTemp = TEXTBUFF
    sngRnd1 = Int(Rnd * 99999)
    strPart3 = Format(sngRnd1, "00000")
    Mid(strTemp, 11) = strPart3 '存放随机数
    strPart2 = CStr((i Xor sngRnd1) Xor 888) '这里的888是随便加入的一个key
    strPart4 = 10 - Len(strPart2) '前面需要用0补齐的位数
    Mid(strTemp, strPart4 + 1) = strPart2 '存放异或的结果
    Mid(strTemp, 16) = (Val(strPart4) + Left(strPart3, 1)) Mod 10 '存放无用的0的个数
    If strPart4 > 0 Then Mid(strTemp, 1) = Int(Rnd * (10 ^ strPart4 - 1)) '需要用0补齐的位数用随机数填充
    txtresult1.Text = txtresult1.Text & strTemp & vbCrLf
Next
我将caozhy版主给出的方法稍微改进了下。 16位数分成4部分处理:随机补齐0+异或结果+随机数+0位数的个数,看起来还行,只是一些大数还是看起来有部分重合。



大数:



这样的方法生成100万个只要几秒啊。如果能对大数的情况再改进点就好了。 --------------------编程问答--------------------
引用 49 楼 sysdzw 的回复:
Dim i, sngRnd1, strJiami
Dim strPart1$, strPart2$, strPart3$, strPart4$, strTemp$
Const TEXTBUFF As String = "0000000000000000"
txtresult1.Text = ""
Randomize
For i = t1.Text To t2.Text
    strTemp = TEXTBUFF
    sngRnd1 = Int(Rnd * 99999)
    strPart3 = Format(sngRnd1, "00000")
    Mid(strTemp, 11) = strPart3 '存放随机数
    strPart2 = CStr((i Xor sngRnd1) Xor 888) '这里的888是随便加入的一个key
    strPart4 = 10 - Len(strPart2) '前面需要用0补齐的位数
    Mid(strTemp, strPart4 + 1) = strPart2 '存放异或的结果
    Mid(strTemp, 16) = (Val(strPart4) + Left(strPart3, 1)) Mod 10 '存放无用的0的个数
    If strPart4 > 0 Then Mid(strTemp, 1) = Int(Rnd * (10 ^ strPart4 - 1)) '需要用0补齐的位数用随机数填充
    txtresult1.Text = txtresult1.Text & strTemp & vbCrLf
Next
我将caozhy版主给出的方法稍微改进了下。 16位数分成4部分处理:随机补齐0+异或结果+随机数+0位数的个数,看起来还行,只是一些大数还是看起来有部分重合。



大数:



这样的方法生成100万个只要几秒啊。如果能对大数的情况再改进点就好了。
caozhy版主帮忙看看这个方法有没有什么隐患呢,别加密了然后没法解密那就出大问题了。 解密方法很简单:
Private Function jiemi(ByVal str1$) As String
    Dim i%, j%, strTmp%, s1$, s2$, s3$, s4$
    s1 = (Val(Right(str1, 1)) + 10 - Mid(str1, 11, 1)) Mod 10
    jiemi = Mid(str1, s1 + 1, 10 - s1) Xor Mid(str1, 11, 5) Xor 888
End Function
--------------------编程问答-------------------- 你的“大数部分”效果不好,自然就是你的算法不合理造成的。

你的“密文”前面10个字符,是跟“序号”相关的。
而你的 Xor 操作,一个是随机数(最大值99999),另一个是常数888,
Xor 的结果,只会影响到序号的低9位(二进制位),9位二进制 &H1FFFF = 131071,
也就是序号超过这个值的时候,“高位”部分不会变化,
&H1FFFF 的10进制数共6位,但最高位为1,相当于它的“影响力”还不足 5.5位(10进制位)。

简单地说,你的 Xor 操作对“密文”的第1到第4个字符,不会有影响;
  如果序号的“十万位”大于2时,你的Xor操作对第6字符基本无影响。

所以你就看到“大数”序号时,前面几个字符没变化的问题。
当然,序号倍数少时填充了随机数除外。
还有就是 Xor 操作时把第9位(低到高,2进制位)从0变成1造成进位除外
(比如你的19999......进位成20000.......) --------------------编程问答-------------------- 上面输错了一个字,应该是“你的Xor操作对第6字符基本无影响。”

楼主怎么不考虑对 xor 的结果进行循环移位呢?

--------------------编程问答-------------------- 晕,复制下来,没把那个6改成5,就提交了。

--------------------编程问答-------------------- CoCreateGuid
Creates a GUID, a unique 128-bit integer used for CLSIDs and interface identifiers.

HRESULT CoCreateGuid(
  GUID  *pguid  //Pointer to the GUID on return
);
 
Parameter
pguid 
[out] Pointer to the requested GUID on return. 
Return Value
S_OK 
The GUID was successfully created. 
Win32 errors are returned byUuidCreate but wrapped as an HRESULT.

Remarks
The CoCreateGuid function calls the RPC function UuidCreate, which creates a GUID, a globally unique 128-bit integer. Use the CoCreateGuid function when you need an absolutely unique number that you will use as a persistent identifier in a distributed environment.To a very high degree of certainty, this function returns a unique value – no other invocation, on the same or any other system (networked or not), should return the same value.

QuickInfo
  Windows NT: Use version 3.1 or later.
  Windows: Use Windows 95 or later.
  Windows CE: Unsupported.
  Header: Declared in objbase.h.
  Import Library: Included as a resource in ole32.dll.

See Also
UuidCreate 



 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 41 楼 sysdzw 的回复:
Quote: 引用 37 楼 benben2301 的回复:

Quote: 引用 22 楼 sysdzw 的回复:

Quote: 引用 20 楼 bakw 的回复:

Quote: 引用 16 楼 sysdzw 的回复:

Quote: 引用 14 楼 bakw 的回复:

呵呵,其实这个只是个人心理障碍的问题,就像变魔术,没揭开别人就觉得很神奇,揭开了就觉得没什么,一千万正好是八位数全覆盖其实这样挺好的。
不是这个意思。因为这样跟半个流水号差不多。要严格的随机无序。

我不说谁知道,如果我不告诉你算法,我说我提供给你一千万个随机号,那你觉得呢?觉得可行的话我帮你生成序列号,你拿着用,别管我怎么算出来,保证不重复。
我以前想过,空出前三位表示作为代号。但是某个批次出来的产品,前面都一样的编号是不允许的。所以废弃了。 我本来是打算把这前三位代号分散到不连续的位,但是还是能看出来。 这方案我考虑过很深了。


我用10秒钟给你生成1000万不重复的16位串号,真不知道你们到底认为有什么技术难点。。。。

看起来很随机了。每个16位数用了几次随机函数?还是其他的什么系统函数? 10秒钟就1000万很强大了。


程序在另一个帖子里贴了,非常简单。。。。每个16位数使用16次随机数。 --------------------编程问答-------------------- 生成1000W数据,在我的电脑上约14.5秒。

运行测试过几次,1000W数据,无重复。
楼主有兴趣的话,可以试下2亿或20亿数据时有无重复。
Option Explicit

Private Sub Command1_Click()
   Const TEXTBUFF As String = "0000000000000000"
   Const ITEMSIZE As Long = 10000000
   Const VAL_BASE As Long = 12435
   Const VAL_VOLA As Long = 99999 - VAL_BASE
      Dim strTextOut(ITEMSIZE - 1) As String
      Dim strTemp$, i&, iRnd&
      Dim strDist$, p&
      
   Randomize
   For i = 0 To ITEMSIZE - 1
      strTemp = TEXTBUFF
      iRnd = VAL_BASE + Rnd() * VAL_VOLA
      Mid$(strTemp, 11) = iRnd
      iRnd = ULongCycL(i Xor iRnd, iRnd)
      strDist = iRnd
      p = 10 - Len(strDist)
      Mid$(strTemp, p + 1) = iRnd
      Mid$(strTemp, 16) = (p + Mid$(strTemp, 12, 1)) Mod 10
      If (p > 0) Then Mid$(strTemp, 1) = Left$(Int(Rnd() * VAL_VOLA), p)
      strTextOut(i) = strTemp
      'If (CLng(jiemi(strTemp)) <> i) Then MsgBox "解密出错!", vbExclamation
   Next
End Sub

Private Function ULongCycL(ByVal iValue As Long, ByVal iBitsN As Long) As Long
   Dim iDivA&, iDivB&, iMASK&
   If (iValue = 0) Then ULongCycL = 0: Exit Function
   iBitsN = iBitsN Mod 31
   If (iBitsN = 0) Then
      ULongCycL = iValue:  Exit Function
   Else
      iDivA = 2 ^ iBitsN
      iDivB = 2 ^ (31 - iBitsN)
      iMASK = iDivB - 1
      ULongCycL = (iValue And iMASK) * iDivA _
                     Or (iValue And &H7FFFFFFF) \ iDivB
   End If
End Function

Private Function ULongCycR(ByVal iValue As Long, ByVal iBitsN As Long) As Long
   Dim iDivA&, iDivB&, iMASK&
   If (iValue = 0) Then ULongCycR = 0: Exit Function
   iBitsN = iBitsN Mod 31
   If (iBitsN = 0) Then
      ULongCycR = iValue:  Exit Function
   Else
      iDivA = 2 ^ (31 - iBitsN)
      iDivB = 2 ^ iBitsN
      iMASK = iDivB - 1
      ULongCycR = (iValue And iMASK) * iDivA _
                     Or (iValue And &H7FFFFFFF) \ iDivB
   End If
End Function

Private Function jiemi(strEnText As String) As String
' 对生成的16位序列号“还原”原始序号
      Dim p&, v&, strTemp$
   p = (10 + (Mid$(strEnText, 16) - Mid$(strEnText, 12, 1))) Mod 10
   v = Mid$(strEnText, 11, 5)
   jiemi = ULongCycR(CLng(Mid$(strEnText, p + 1, 10 - p)), v) Xor v
End Function
--------------------编程问答-------------------- 用线性同余法可以直接生成1亿个不重复的8位随机数,将前后两个数用字符串方式连接成16位,依然不重复。
Option Explicit

#Const OUTPUT_MODE = 1 '0:仅生成随机数; 1:合成16位编码; 2:输出编码到csv文件。'

Sub Main()
    Const a As Long = 21 '乘法系数'
    Const m As Long = 100000000 '模'
    Const c As Long = 65519 '增量'
    Dim r As Long '随机数'
    Dim rLast As Long '前个随机数'
    
    r = GetTickCount() '种子'
    
#If OUTPUT_MODE > 0 Then
    Dim sCode As String
    sCode = "00000000" & Format$(r, "00000000")
#End If
#If OUTPUT_MODE = 2 Then
    Dim hFile As Integer
    
    hFile = FreeFile()
    Open App.Path & "\Code-16.csv" For Output Access Write As #hFile
#End If

    Dim tc1 As Long
    Dim tc2 As Long
    Dim i As Long
    
    tc1 = GetTickCount()
    
#If OUTPUT_MODE = 2 Then
    For i = 0 To 1000000 '输出文件只测试100万个'
#ElseIf OUTPUT_MODE = 1 Then
    For i = 0 To 10000000 '合成只测试1000万个'
#Else
    For i = 0 To 100000000
#End If

        rLast = r
        r = (r * a + c) Mod m

#If OUTPUT_MODE > 0 Then
        Mid$(sCode, 1, 8) = Mid$(sCode, 9, 8)
        Mid$(sCode, 9, 8) = Format$(r, "00000000")
#End If
#If OUTPUT_MODE = 2 Then
        'Print #hFile, Format$(rLast, "00000000"); Format$(r, "00000000")
        Print #hFile, sCode
#End If

    Next
    
    tc2 = GetTickCount()

#If OUTPUT_MODE = 2 Then
    Close #hFile
#End If

    MsgBox (i - 1) & " 个用时 " & ((tc2 - tc1) / 1000) & " 秒。"
End Sub

Inter CPU 2.33GHz 的机器上,exe 执行结果
模式0: 1亿个用时 1.063 秒。
模式1: 1千万个用时 13.703 秒。
模式2: 1百万个用时 2.984 秒。——这个和硬盘有关,意义不大。
输出csv格式如下:
2837785996000558
9600055816077237
1607723737687496
3768749691502935
9150293521627154
2162715454235753
5423575339016332
3901633219408491
1940849107643830
0764383060585949
...


--------------------编程问答-------------------- 同样的方法,在 VB.Net 中合成编码方便多了,而且速度也快。
dim rCode as long = CLng(rLast) * m + r
dim sCode as string = rCode.ToString("d16")

模式0: 1亿个用时 1.094 秒。
模式1: 1千万个用时 4.172 秒。
--------------------编程问答-------------------- 留下罪证,秋后算账 --------------------编程问答-------------------- 挺有意思,占位学习! --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 把16 位分为4*4。每四位随机。
使用笛卡尔积得到所有的集合。

但这样的应该不是最小密度的随机数。因为前面的固定了。这样破解就会容易太多了。
--------------------编程问答-------------------- --------------------编程问答-------------------- 学习了,都是高手 --------------------编程问答-------------------- learning --------------------编程问答--------------------
引用 8 楼 bakw 的回复:
洗牌算法吧,先按顺序生成,然后随机打乱输出

这个策略最可靠,速度最快,不会出现重复选择然后查询的情况,以前进行过类似算法的研究,这种思路最大的好处就是永远不会随机出重复数据,是否重复不需要判断,这是其他算法难以比拟的,需要判断重复数据的算法永远的问题是产生大量数据后,最后几个数字重复概率太高,也许最后一个数字永远都随机不出来了。
这个算法可以理解为生成一个1000万的顺序列表,然后随机(范围0到1000万-1)从列表中取数字,被取出的数字从列表中排除(为了排除方便,可能需要注意这个列表的数据结构模型,增加定位删除速度),下一次再取数字时,随机数范围0到1000万-2,也就是这个范围每次减一,直到取完1000万个数,这样明面代码循环访问列表的次数是2*1000万,存储空间最大1000万个数据大小,效率是比较高的。
同时上面最后说明了是明面代码循环访问数组的次数,额外的访问主要是列表数据结构的选择有关,如果是数组,定位速度不耗时间,但是删除元素要循环移位,耗时比较厉害,选择线性链表删除速度很快,就是定位耗时,不过仅仅是定位检索,耗时相对快些,推荐使用线性链表,如果要求更高,估计要选用二叉树等其他存储方式,检索和删除速度折中提高效率,二叉树方式没有具体尝试过。

--------------------编程问答-------------------- 我上面的算法最适合的应用是随机生成1000万个数字序列,而且这些数字的范围也是1到1000万。
如果1000万个16位数,因为1000万才8位,所以还有及其大量的空余数字可以选择,那么楼上几位只要能保证不重复数字的算法也都很强劲,学习下。 --------------------编程问答-------------------- 加密的思路非常好,随机选择一个密码,然后对1-10000k进行加密,得到的结果1.一定都是不同的(加密算法的正确性);2.在不知道密码的情况下,这些密文跟随机数没有区别。(这是加密算法的安全性),根本不需要记录。斑竹知识面窄,不要动不动就说什么“不可能”,不懂不丢人,不要放弃治疗。
--------------------编程问答-------------------- 谢谢各位。随机的方法大家给出了很多方法和思路,不少还直接给出了代码,有c、c++、c#也有vb的。我最初用Chen8013的前八+后八随机测试,发现基本没有重复的,这个是最简单的办法。其他各位也很不错还没来得及细细分析。

不过因为实际数据确实会很庞大,用任何一个数据库都是个大问题,就是nosql之类的方法硬盘存储也是个问题。 我现在只是将流水号加密,然后再解密核查属于哪个批次。 这样基本占用不了多少空间,任何一个一百来兆的虚拟主机都可以应付。 关于加密解密的问题我应该另外开个贴的。 --------------------编程问答-------------------- 1亿个随机数啊,那就拿10亿以内,9的整倍数出来,然后按照提取的时间飞秒字段排序就行了。 --------------------编程问答--------------------
引用 71 楼 yuwenge 的回复:
1亿个随机数啊,那就拿10亿以内,9的整倍数出来,然后按照提取的时间飞秒字段排序就行了。

要获取提取时间还是太占资源,干脆就按百位或者千位排序好了。 --------------------编程问答-------------------- 不是有个获取系统时间的吗?
系统时间是要到毫秒的那种~
获取到之后加再随机数然后再MD5下不就超简单吗?
这样就要循环10000万次
就不会有相同的了~ --------------------编程问答-------------------- 很简单:前10位随机数,后6位时间戳递增。

当年写的卡号生成器就这样,几秒钟就生成百万条记录了。 --------------------编程问答-------------------- 会不会  出现重复的数字 --------------------编程问答-------------------- 不知道效果怎么样 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 学习了,真的很不错 --------------------编程问答-------------------- 学习了,真的很不错 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 很好 --------------------编程问答-------------------- --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 73 楼 a82344626 的回复:
不是有个获取系统时间的吗?
系统时间是要到毫秒的那种~
获取到之后加再随机数然后再MD5下不就超简单吗?
这样就要循环10000万次
就不会有相同的了~

一亿条数据都做md5需要多少系统消耗? --------------------编程问答-------------------- 虽然不知道你们在说什么,但看起来很厉害的样子。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 使用前缀树,每产生一个,就把对印的路径标记出来。 http://www.csxhgs.com/ --------------------编程问答-------------------- 学习了,谢谢了 --------------------编程问答-------------------- 分阿荣旗发软文 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 都是牛人啊这么多技巧有的学了 --------------------编程问答-------------------- 实在是太乱了 我脑子疼 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 3 楼 sysdzw 的回复:
Quote: 引用 2 楼 caozhy 的回复:

使用前缀树,每产生一个,就把对印的路径标记出来。

了解到些信息。有人用的rsa,对数据加密和解密。

每次根本不用考虑重复。 直接对1~10万 进行rsa加密成16位,都是一对一的。 而且可以解密。caozhy有了解这方面么?
sdfsd s --------------------编程问答-------------------- 除 --------------------编程问答--------------------
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,