我正在寻找一种独立于平台的方法来为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上运行?
注意:经过这么多年,我应该指出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所需的随机访问.
| 归档时间: |
|
| 查看次数: |
712 次 |
| 最近记录: |