2009-09-08 36 views
3

我需要一个独特的内部int来使用,它将代表几个随机内容类型,我无法将其作为类常量或配置选项进行硬编码。然而,当我可以用更容易的术语“发布”时,我不想提及“2”。所以尽管有一种方法可以从一个字符串中获取INT值,这对于一些项目来说似乎可以非常有效地发挥作用。将字符串转换为唯一的数值在php

有没有办法做到这一点在PHP而不是我所建?

$strings = array('post', 'comment', 'blog', 'article', 'forum', 'news', 'page'); 

foreach($strings as $string) { 

    print $string . ' = '; 

    $string = str_split($string); 
    $sum = 0; 
    foreach($string as $char) { 
     $sum += ord($char); 
    } 

    var_dump($sum); 

    print '<br />'; 
} 

这与用户输入无关,所以不要担心设计中的明显缺陷。

:编辑:

我需要在快看看UPS数据库中存储数字索引。即从“物品”或“新闻”中告知“帖子”。然而我不知道这些1-8种类型的内容将被调用,所以我不能在应用程序中将这些内容硬编码为常量。因此,我认为最好的办法就是创建每个单词的数字版本(这意味着检查以确保两个单词不总和为相同的数字)。

如果这是一个系统将有超过8个单词,那么这种方法注定要失败的概率总和冲突。另外,如果我有选择知道将使用哪些单词,那么这也将是可怕的设计,因为类常量会更好。

+0

你为什么不使用MD5哈希例如?(如果你不需要一个号码) – yoda 2009-09-08 02:32:02

回答

9

您可以使用crc32,这是一个校验和函数,它只是返回一个4字节的整数。

+0

这真棒,没有什么可以更简单。 – Xeoncross 2009-09-09 17:52:39

+0

+1谢谢,我特地寻找一个4字节的整数;任何其他小的结果都可以达到8字节,但这是完美的。 – 2015-06-08 01:33:59

0
$strings = array('post' => 0, 'comment' => 1, 'blog' => 2, 'article' => 3, 'forum' => 4, 'news' => 5, 'page' => 6); 

$s = 'comment'; 
$s_as_int = $strings[$s]; 
+0

“然而,我不想引用”2“,当我可以使用更容易的术语”后“” – yoda 2009-09-08 02:35:28

+0

是啊,你可以使用'后'所有你想要的,然后当你需要整数$ strings ['post'] – JasonWoof 2009-09-08 02:53:29

+0

基本上,我在这里建议的是,你可以使用字典来将字符串映射为整数。你也可以使用一个常规数组,而不是$ strings ['post']来转换为int,你可以使用array_search('post',$ strings)。当你添加需要输入的新单词时,只需将它们推到$ strings的末尾 – JasonWoof 2009-09-08 02:57:10

1

您不能使用单个唯一整数,因为两个不同的整数有很高的相加结果的机会。 3 + 3 = 6; 2 + 2 + 2 = 6;

你最好使用不可逆散列。这更多的是一个独特的序列,然后是序列的总和。

即:MD5(),SHA1(),SHA256()等

您还可以使用PHP5的spl_object_hash(),它独特的哈希分配到每个对象。 http://us3.php.net/manual/en/function.spl-object-hash.php

ps:如果你需要整数,你会使用真正的大整数。因此,您可以只连接示例中的整数,而不是添加它们。

0
<?php 
$strings = array('post', 'comment', 'blog', 'article', 'forum', 'news', 'page'); 

foreach($strings as $string) 
{ 
    echo $string . ' = ' . base_convert(md5($string), 16, 10) . '<br />'; 
} 
?> 
0

难道你只是array_flip()array_search()你的字典?

或将您的数据库字典以及名为dictionary另一个表看起来像这样(MySQL的)

CREATE TABLE `dictionary` (
    `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `word` VARCHAR(25), 
    UNIQUE `word` (`word`) 
) 
+0

不是真的,我没有一连串的单词,我也不知道他们会是什么。我之后的开发人员将创建其中的一些。 – Xeoncross 2009-09-10 15:03:54