在D中生成随机字母数字字符串

Gli*_*ire 2 random twitter d

我正在寻找一种独立于平台的方法来为Twitter随机数生成随机字母数字字符串.目前我正在使用它,但它取决于/dev/random哪个显然是特定于UNIX的:

private auto _getNonce() {
    ubyte[32] buffer;
    File devRandom  = File("/dev/random", "rb");
    auto randomData = devRandom.rawRead(buffer);
    auto randomBase = Base64.encode(randomData);

    auto nonWords   = regex(r"[\W_]", "g");
    return replaceAll(randomBase, nonWords, "");
}
Run Code Online (Sandbox Code Playgroud)

这遵循Twitter开发文档中的建议来获取32字节的随机数据,base-64对它们进行编码并去除所有非字母数字字符.

nonce不必是加密安全的,它只是用于防止重复提交.有没有更好的方法可以在Windows和UNIX上运行?

he_*_*eat 6

注意:经过这么多年,我应该指出randomCover不重复.这意味着此解决方案仅提供一次小写字符和一次大写字符.我看着cycle()用来解决这个问题,但randomCover不支持无限范围.

如果您只需要32个字母数字字符:

import std.algorithm : fill;
import std.ascii : letters, digits;
import std.conv : to;
import std.random : randomCover, rndGen;
import std.range : chain;
import std.stdio : writeln;

void main() {
    // dchar[] are random access, strings (char[]) are not
    auto asciiLetters = to!(dchar[])(letters);
    auto asciiDigits = to!(dchar[])(digits);

    dchar[32] key;
    fill(key[], randomCover(chain(asciiLetters, asciiDigits), rndGen));
    writeln(key);
}
Run Code Online (Sandbox Code Playgroud)

范围文档特别指出

static assert(!isNarrowString!R); //窄字符串不能作为范围索引

窄字符串是char []和wchar [].虽然它们是数组,但是在O(1)中找不到"字符"2,531,这阻止了这些类型被认为是randomCover所需的随机访问.