La meilleure façon de générer des NSData objet avec des octets aléatoires d'une longueur spécifique?
Si je crée un nouveau NSData objet d'une taille spécifique à l'aide de dataWithBytes:longueur:, quel est le moyen le plus efficace pour créer les octets d'entrée (20 Mo) de caractères aléatoires, de préférence sans lire les données à partir d'un fichier? J'ai besoin d'un unique tampon d'une taille spécifique à chaque fois.
Grâce
OriginalL'auteur Bama91 | 2011-02-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer un 20*2^20b
NSData
objet, puis ajouter un hasard 4 octets entier 20*2^20/4 fois avecarc4random()
. Je crois que vous devez inclurestdlib.h
(via La génération de nombres aléatoires en Objective-C).J'ai pensé commentaire, ce code a une fuite. Au lieu d'allouer un NSMutabledata suffit d'utiliser [NSMutableData dataWithCapacity:twentyMB].
Grâce OlvaresF, j'ai fait ce changement.
OriginalL'auteur Thomson Comer
Les octets ne sont pas "aléatoire", mais contiennent des ordures valeurs (tout ce qui était sur le tas avant de cette a été exécuté). L'avantage d'être rapide et le code est concis.
Il est intéressant de noter que vous devez être un peu prudent sur l'endroit où vous l'utilisez. Par exemple, il ne serait pas une bonne idée pour ensuite envoyer ces données à un serveur qu'il suffisait de faire un dump de votre mémoire.
Ce ne sera pas toujours comme si vous lui en demandez trop d'octets, la fonction malloc() iront directement au noyau et d'allocation de pages, qui sont remis à zéro par défaut. En outre, si vous exécutez cet extrait très peu de temps après votre application lancée, malloc avec le retour de la mémoire qui n'a jamais été utilisé avant (c'est à dire à partir nouvellement allouée pages), de sorte également remis à zéro.
C'est horrible, il ne génère pas d'/retour octets aléatoires, il retourne octets qui n'ont rien d'aléatoire, soit zéro ou utilisés précédemment octets qui ont un modèle!
NSData *data = [[NSData alloc] initWithBytesNoCopy:octets longueur: numberOfBytes freeWhenDone:YES];
OriginalL'auteur Robert
Voici un 3-liner swift version:
Swift 2
Swift 3
let bytes = [UInt32](repeating: 0, count: length).map { _ in arc4random() } let data = Data(bytes: bytes, count: length )
. peut-être que vous voulez mettre à jour votre commentaireMerci, c'est parfait!
OriginalL'auteur Loïs Di Qual
Vous pouvez envisager d'utiliser
CCRandomGenerateBytes
fonction deCommonCrypto
pour générer des données aléatoires. Comme:OriginalL'auteur sgl0v
La version originale a un bug, mais le mien prend soin de tout cela et j'espère ne pas introduire de nouveaux.
Espérons que cela aide.
Voici son test unitaire:
OriginalL'auteur lifeanxiety
Swift 3:
OriginalL'auteur garafajon
urandom est plus efficace.
Ici est une catégorie de générer au hasard des tampons:
OriginalL'auteur Gilad Novik
J'ai open source mon JFRandom classe, plus sur github qui peut faire exactement cela. Voici un post de blog montrant comment obtenir/de l'utiliser pour atteindre votre objectif...
http://jayfuerstenberg.com/devblog/generating-random-numbers-strings-and-data-in-objective-c
OriginalL'auteur Jason Fuerstenberg
Utilisation
arc4random_buf
pour remplir la mémoire tampon avec des octets aléatoiresObj-C
OriginalL'auteur Eporediese