Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在寻找可以使用任意字节数进行种子设定的PRNG_C#_.net_Random_Prng - Fatal编程技术网

C# 正在寻找可以使用任意字节数进行种子设定的PRNG

C# 正在寻找可以使用任意字节数进行种子设定的PRNG,c#,.net,random,prng,C#,.net,Random,Prng,我正在寻找一个PRNG(伪随机性),您最初使用一个任意字节数组进行种子设定 听说过吗?为什么不将任意序列异或成正确长度的类型(如有必要,用其自身的一部分填充)?例如,如果您想要种子“paxdiablo”,并且您的PRNG有一个四字节种子: paxd 0x70617864 iabl 0x6961626c opax 0x6f706178 ---------- 0x76707b70 or 0x707b7076 (Intel-endian). 我知道种

我正在寻找一个PRNG(伪随机性),您最初使用一个任意字节数组进行种子设定


听说过吗?

为什么不将任意序列异或成正确长度的类型(如有必要,用其自身的一部分填充)?例如,如果您想要种子“paxdiablo”,并且您的PRNG有一个四字节种子:

paxd    0x70617864
iabl    0x6961626c
opax    0x6f706178
        ----------
        0x76707b70 or 0x707b7076 (Intel-endian).
我知道种子看起来是人造的(因为密钥是从字母字符中选择的)。如果您真的想让它在短语可能来自类似范围的地方完全不同,请使用诸如
0xdeadbeef
0xa55a1248
之类的区分符再次对其进行异或:

paxd    0x70617864    0x70617864
iabl    0x6961626c    0x6961626c
opax    0x6f706178    0x6f706178
        0xdeadbeef    0xa55a1248
        ----------    ----------
        0xa8ddc59f    0xd32a6938

我更喜欢第二个,因为它更容易将相似的字节移动到不同的范围(微分器中字节的高位是不同的)。

为什么不将任意序列异或到正确长度的类型中(如果需要,用自身的一部分填充它)?例如,如果您想要种子“paxdiablo”,并且您的PRNG有一个四字节种子:

paxd    0x70617864
iabl    0x6961626c
opax    0x6f706178
        ----------
        0x76707b70 or 0x707b7076 (Intel-endian).
我知道种子看起来是人造的(因为密钥是从字母字符中选择的)。如果您真的想让它在短语可能来自类似范围的地方完全不同,请使用诸如
0xdeadbeef
0xa55a1248
之类的区分符再次对其进行异或:

paxd    0x70617864    0x70617864
iabl    0x6961626c    0x6961626c
opax    0x6f706178    0x6f706178
        0xdeadbeef    0xa55a1248
        ----------    ----------
        0xa8ddc59f    0xd32a6938

我更喜欢第二个,因为它更容易将相似的字节移动到不同的范围(微分器中字节的高位是不同的)。

散列任意长度的种子(而不是像paxdiablo建议的那样使用XOR)将确保冲突极不可能发生,也就是说,等于哈希冲突的概率,比如SHA1/2,这实际上是不可能的

然后,您可以使用散列种子作为一个像样的PRNG的输入,例如我最喜欢的Mersenne Twister

更新

此处可用的Mersenne Twister实现似乎已经接受任意长度的密钥:

更新2

为了分析SHA2碰撞的可能性,请看人们需要付出多大的努力才能找到,引用:

对SHA-2有两次中间会合前像攻击,减少了子弹数。第一种攻击64轮中的41轮SHA-256,时间复杂度为2^253.5,空间复杂度为2^16;第二种攻击80轮中的46轮SHA-512,时间复杂度为2^511.5,空间复杂度为2^3。第二种攻击42轮SHA-256,时间复杂度为2^251.7,空间复杂度为2^12,42轮SHA-512,时间为2^502,空间为2^22


散列任意长度的种子(而不是像paxdiablo建议的那样使用XOR)将确保冲突极不可能发生,即等于散列冲突的概率,比如SHA1/2,这在实际中是不可能的

然后,您可以使用散列种子作为一个像样的PRNG的输入,例如我最喜欢的Mersenne Twister

更新

此处可用的Mersenne Twister实现似乎已经接受任意长度的密钥:

更新2

为了分析SHA2碰撞的可能性,请看人们需要付出多大的努力才能找到,引用:

对SHA-2有两次中间会合前像攻击,减少了子弹数。第一种攻击64轮中的41轮SHA-256,时间复杂度为2^253.5,空间复杂度为2^16;第二种攻击80轮中的46轮SHA-512,时间复杂度为2^511.5,空间复杂度为2^3。第二种攻击42轮SHA-256,时间复杂度为2^251.7,空间复杂度为2^12,42轮SHA-512,时间为2^502,空间为2^22


谢谢,我想到了这个。然而,这个函数作为散列函数有效地工作。因此,虽然我的输入更加多样化,但我将其缩小到一个较小的窗口,增加了冲突的可能性。我想避免这样。我见过PRNG实现使用由较小的种子生成的支持表。但是我应该能够用任何字节数组作为输入生成相同的表。输入越大,碰撞的可能性越小,对吗?这就是我想要的。谢谢,我想到了这个。然而,这个函数作为散列函数有效地工作。因此,虽然我的输入更加多样化,但我将其缩小到一个较小的窗口,增加了冲突的可能性。我想避免这样。我见过PRNG实现使用由较小的种子生成的支持表。但是我应该能够用任何字节数组作为输入生成相同的表。输入越大,碰撞的可能性越小,对吗?这就是我想要的。有时候你会很幸运。我一直在考虑梅森龙卷风。不过,他对实施情况并不确定。谢谢代码需要一些修改,从现有的Random类继承是愚蠢的,除此之外,看起来很棒!SHA256给出2^256个不同的可能哈希值。为了让你知道它有多大,在已知的宇宙中大约有2^265个原子。有时你会很幸运。我一直在考虑梅森龙卷风。不过,他对实施情况并不确定。谢谢代码需要一些修改,从现有的Random类继承是愚蠢的,除此之外,看起来很棒!SHA256给出2^256个不同的可能哈希值。为了让你知道它有多大,在已知的宇宙中大约有2^265个原子。