从C#中的字符串创建伪随机种子?

从C#中的字符串创建伪随机种子?,c#,random,random-seed,procedural-generation,procedural-programming,C#,Random,Random Seed,Procedural Generation,Procedural Programming,对于伪随机生成器(与游戏相关),我需要从字符串创建种子。这不是为了安全,但我还是希望这颗种子尽可能随机 我不使用GetHashCode(): 每个.NET版本的实现可能不同 我也不确定GetHashCode()的随机性 现在我使用MD5-请参见下面的代码: public static int GetSeedFromString(string value) { using ( var md5 = MD5.Create() ) { var inputBytes

对于伪随机生成器(与游戏相关),我需要从字符串创建种子。这不是为了安全,但我还是希望这颗种子尽可能随机

我不使用GetHashCode():

  • 每个.NET版本的实现可能不同
  • 我也不确定GetHashCode()的随机性
现在我使用MD5-请参见下面的代码:

public static int GetSeedFromString(string value)
{
    using ( var md5 = MD5.Create() )
    {
        var inputBytes      = Encoding.ASCII.GetBytes(value);
        byte[] hashBytes    = md5.ComputeHash(inputBytes);

        // FIXME: force endianness for potential different systems
        return BitConverter.ToInt32(hashBytes, 0);
    }
}
两个问题:

  • 它依赖于Endian(目前)-但是这可能很容易修复
  • 我不确定这种随机性的传播。它不一定是完美的,但如果有一个更简单的方法,效果更好,我更喜欢它

是否有更常见的方法从字符串生成伪随机种子?

但是是否存在终止性问题
ASCII
是每个字符一个字节。可能是。首先,
位转换器。IsLittleEndian
可以告诉您是否需要反转数组,因此您是对的,这应该很容易修复。第二,你说的“传播”到底是什么意思?哈希是专门为减少冲突而设计的,所以如果您想避免这些冲突,哈希似乎不是一个坏的选择。但这完全取决于你的要求有多严格。你有没有注意到有什么让你觉得哈希不合适的地方?简单而直接地说:
if(value为null)返回0;var-hash=17;未选中的{foreach(值中的var c){hash=(hash*31)^c;}}返回hash?——17和31是质数,应该会导致某种程度上的均匀分布。不确定其他素数是否会产生更好的分布。MD5是一个加密哈希,因此速度较慢。它也坏了,所以不能提供很多安全性。如果您不需要加密级别的安全性,那么我建议使用更快的非加密散列,如。它生成大小范围内的无符号数字输出。