快速混淆 NSString 顺序的方法?

Posted

技术标签:

【中文标题】快速混淆 NSString 顺序的方法?【英文标题】:Quick way to jumble the order of an NSString? 【发布时间】:2012-02-18 15:57:16 【问题描述】:

有谁知道改变现有 NSString 或 NSMutableString 字符顺序的现有方法?无论如何,我有一个解决方法,但如果有现成的方法,那就太好了。

例如,给定字符串@"HORSE",返回@"ORSEH"、@"SORHE"、@"ROHES"等的方法?

【问题讨论】:

【参考方案1】:

考虑以下代码: .h 文件:

@interface NSString (Scrambling)

+ (NSString *)scrambleString:(NSString *)toScramble;

@end

.m 文件:

@implementation NSString (Scrambling)

+ (NSString *)scrambleString:(NSString *)toScramble 
   for (int i = 0; i < [toScramble length] * 15; i ++) 
      int pos = arc4random() % [toScramble length];
      int pos2 = arc4random() % ([toScramble length] - 1);
      char ch = [toScramble characterAtIndex:pos];
      NSString *before = [toScramble substringToIndex:pos];
      NSString *after = [toScramble substringFromIndex:pos + 1];
      NSString *temp = [before stringByAppendingString:after];
      before = [temp substringToIndex:pos2];
      after = [temp substringFromIndex:pos2];
      toScramble = [before stringByAppendingFormat:@"%c%@", ch, after];
   
   return toScramble;


@end

不是最漂亮的代码或执行,但可以完成工作。可能有一种 (const char *) 方法可以做到这一点,但这对我来说很好。快速测试显示在我的 Mac 上执行的时间为 0.001021 秒。

用法:

NSString *scrambled = [NSString scrambleString:otherString];

改编自另一种语言/伪代码的代码

【讨论】:

如果您在 10.7 或 ios 4.3+ 上运行代码,arc4random_uniform(maxIntIndex) 是更好的随机数生成器。如果您需要支持任何较旧的东西,arc4random() 仍然很好。 啊,当我为 10.5 编译时,它没有出现在“建​​议”菜单中。很高兴知道。 @HiGuy'CouleeApps'Smith 感谢您的评论,但我在让它工作时遇到问题:语义问题:找不到类方法'+scrambleString:'(返回类型默认值to 'id') 知道如何解决吗?我已经把它放在头文件和实现文件中 表示找不到方法。确保您对 .h 文件进行了#import-ed,并且该方法已在“@interface NSString (Scrambling)”下的 .h 中指定 为了使这项工作更好,更多字符,将%c替换为%C并将ch的类型更改为unichar(这是characterAtIndex:的返回类型) .【参考方案2】:

您可以使用 Durstenfeld 的变体 Fisher-Yates Shuffle。

对于非常长的字符串,您可以通过将 unichar 复制到 unichar 缓冲区,然后使用 c 或 c++ 方法执行转换以交换字符来节省大量 CPU 时间和分配。请注意,UTF8String 不是您要使用的缓冲区,也不应该对其进行变异。然后从洗牌缓冲区创建(或设置)一个新的NSString

有关 Fisher Yates 算法以及 C 和 C++ 实现的更多信息can be found here。

【讨论】:

以上是关于快速混淆 NSString 顺序的方法?的主要内容,如果未能解决你的问题,请参考以下文章

苹果原生请求封装

NSString跟SwiftString的区别和使用场景

ipad - 将 NSString 写入文本文件

如何在NSString中使用NULL字符?

oc代码混淆

MapView 上的注解:坐标