2014-09-18 615 views
-4

是否可以基于字符串生成伪随机数字,这意味着特定的字符串总是会返回相同的数字?如何根据字符串生成一个随机数?

+2

那么它会不会是随机的呢?并且,是的,这是可能的。你应该修改你的问题,询问它是如何完成的,并缩小到一个特定的范围,而不仅仅是问是否可能。 – 2014-09-18 18:09:34

+2

你在寻找哈希函数吗? (如果是这样,你想要一个使用Javascript还是PHP?你的问题被标记为两个......)但是,可能更重要的是,你为什么要这样做?为您的使用选择正确的散列函数非常重要。 – 2014-09-18 18:10:46

+0

我需要在PHP中执行此操作,对于标记两者都很抱歉,我的错误。我只想为每个文件扩展名分配一个“随机”颜色。例如,“.jpg”应始终指定相同的随机颜色。我不知道我是否有意义。 – Tom 2014-09-18 18:19:21

回答

2

你需要的不是随机,而是哈希函数。

哈希算法创建输入数据的指纹。散列通常不可逆,即不能从散列重构数据。 (但是,如果算法存在缺陷,您可以生成冲突,但只要您没有做任何与安​​全相关的事情,则无需担心。)

不幸的是,没有实施本机哈希算法在JS中,所以你必须实现你自己的。但是,这里是一个SO帖子,显示了一个实现:https://stackoverflow.com/a/7616484/3908235

而且,显然有whole library with the implementation of common algorithms(感谢@MattGibson)。

+1

[CryptoJS有一组哈希](https://code.google.com/p/crypto-js/) – 2014-09-18 18:12:37

0

如果你想在PHP中这样做,那么你可以使用crc32。这不是随机但它产生的数字会根据字符串的内容而有所不同。它不是100%保证两个不同的字符串会产生不同的数字。

实施例:

$number = crc32("http://php.net/manual/en/function.crc32.php"); 

注意$number将是一个无符号的32位整数,但PHP解释所有整数作为带符号的整数,该值可以32位环境之间被不同地表示 - 其可以返回负数和正数 - 和64位环境 - 这将只返回正数。

这是一个好主意,用printf输出这些格式化输出到HTML,

printf("%u", $number); 

为了使各不同架构产生的值的比较,你也应该格式化使用sprintf字符串,刚需安全:

$numberToStoreShareOrCompare = sprintf("%u", $number);