Quel est le moyen le plus rapide pour générer une longue chaîne de caractères aléatoires dans le jeu de Go?
Comme [a-zA-Z0-9] de la chaîne:
na1dopW129T0anN28udaZ
ou chaîne hexadécimale:
8c6f78ac23b4a7b8c0182d
Par long je veux dire 2K et plus de caractères.
!pourquoi voulez-vous un 2Kbyte chaîne aléatoire? Pour les fins d'une résolution de 1024 bits (c'est à dire 128 octets) devrait être suffisant. Et vous aurez du mal à obtenir vraiment aléatoire de 2048 octets.
Et qu'est-ce que le système d'exploitation? Sur Linux, vous pourriez lire à partir de
Il est impossible de répondre à la question sans connaître la qualité requise des nombres aléatoires. Je suppose qu'il n'est pas dans le but de la cryptographie. Aussi je ne comprends pas "le plus rapide". Je ne peux imaginer ce pourrait être un jeu, mais les exigences de chaîne de caractères aléatoires faire regarder comme mot de passe. Mais encore une fois pourquoi le rendement est important.
Peut-être notre réponse est requise pour l'article dans un blog )))
Ce n'est pas pour la cryptographie, c'est pour la base de données de la charge de travail du générateur.
Et qu'est-ce que le système d'exploitation? Sur Linux, vous pourriez lire à partir de
/dev/random
ou /dev/urandom
... kernel.org/doc/man-pages/online/pages/man4/random.4.htmlIl est impossible de répondre à la question sans connaître la qualité requise des nombres aléatoires. Je suppose qu'il n'est pas dans le but de la cryptographie. Aussi je ne comprends pas "le plus rapide". Je ne peux imaginer ce pourrait être un jeu, mais les exigences de chaîne de caractères aléatoires faire regarder comme mot de passe. Mais encore une fois pourquoi le rendement est important.
Peut-être notre réponse est requise pour l'article dans un blog )))
Ce n'est pas pour la cryptographie, c'est pour la base de données de la charge de travail du générateur.
OriginalL'auteur Pavel Paulau | 2012-10-07
Vous devez vous connecter pour publier un commentaire.
Ce n'environ 200 mbps sur ma boîte. Il est évident de place pour l'amélioration.
Vous devriez juste utiliser
io.CopyN
pour produire de la chaîne que vous souhaitez. Évidemment, vous pouvez ajuster le jeu de caractères sur le chemin, ou que ce soit.La bonne chose à propos de ce modèle est qu'il est juste un
io.Reader
de sorte que vous pouvez l'utiliser rien faire.Test est ci-dessous:
Sur un cœur de mon 2.2 GHz i7:
MODIFIER
Depuis que j'ai écrit l'indice de référence, j'ai pensé que je ferais de l'amélioration évidente de la chose en appellent à l'aléatoire de moins en moins souvent). 1/8 les appels à la rand corporation, il fonctionne environ 4x plus rapide, mais c'est un gros plus laide:
Nouvelle version:
Nouvelle référence:
EDIT 2
Pris le masquage dans la distribution de l'octet, car il est redondant. Obtenu une bonne affaire plus rapide:
(c'est tellement plus facile que d'un réel travail soupir)
MODIFIER 3
J'en irc aujourd'hui, j'ai donc sorti une bibliothèque. Aussi, mon outil de référence, tout en étant utile pour la vitesse relative, n'est pas suffisamment précise dans son rapport.
J'ai créé randbo que vous pouvez réutiliser pour produire aléatoire des ruisseaux où vous pourriez en avoir besoin.
OriginalL'auteur Dustin
Vous pouvez utiliser le forfait uniuri pour générer des chaînes de caractères (ou de visualiser le code source pour voir comment ils le font). Vous aurez envie d'utiliser:
Ou, pour spécifier le jeu de caractères utilisé:
OriginalL'auteur Bill the Lizard
C'est en fait un peu biaisé vers les 8 premiers caractères dans le jeu (depuis 255 n'est pas un multiple de
len(alphanum)
), mais cela vous obtiendrez la plupart du chemin.Vrai, la question n'est pas de spécifier si les chaînes doivent être chiffrée de manière aléatoire. Si elles ne le faites pas, votre solution est probablement mieux.
Je suis venu à travers cette grande réponse plusieurs fois et l'a utilisé à chaque fois. Voici une autre façon de générer des chaînes de caractères: play.golang.org/p/1GwSRsKIsd
OriginalL'auteur Evan Shaw
Ici Evan Shaw la réponse de re-travaillé, sans le biais vers les 8 premiers caractères de la chaîne. Notez qu'il utilise beaucoup de cher
big.Int
des opérations n'est probablement pas aussi vite que ça! La réponse est de chiffrement fort.Il utilise
rand.Int
de faire un nombre entier de exactement la bonne taillelen(alphanum) ** n
, alors, ce qui est effectivement une base de conversion en baselen(alphanum)
.Il s'agit certainement d'un meilleur algorithme pour ce qui impliquerait le maintien d'un beaucoup plus petit reste et l'ajout d'octets aléatoires autant de fois que nécessaire. Ce serait de se débarrasser de la coûteuse de l'arithmétique des nombres entiers.
Au moment où vous introduisez crypto/rand.Lecteur, qu'il va faire moins de 30 mbps (sur ma boîte) contre plus de 800 mbits / s.
OriginalL'auteur Nick Craig-Wood
Si vous voulez générer des cryptographique sécurisé chaîne aléatoire, je vous recommande de jeter un oeil à cette page. Voici une fonction d'assistance qui lit
n
octets aléatoires à partir de la source de l'aléatoire de votre système d'exploitation, et d'utiliser ensuite ces octets à base64encode. Notez que la longueur de la chaîne serait plus grand quen
en raison de base64.OriginalL'auteur Salvador Dali
J'ai fait quelques repères et Dustin est randbo paquet a été le plus rapide que j'ai vu. Je folked et de faire quelques optimisations, donc c'est encore plus rapide: GitHub
En fait c'est la réponse plus précise sur la page de la question "Quel est le moyen le plus rapide pour générer une longue chaîne aléatoire en Aller?" puisque c'est la méthode la plus rapide sur la page. Merci pour le -1 mais... toujours agréable d'être apprécié après mon travail sur la réponse à la question.
OriginalL'auteur Alasdair